使用grailsApplication进行Grails单元测试

时间:2015-12-16 12:53:38

标签: unit-testing grails

我有一个控制器,在save方法上调用一个线程来检索一些文件。该线程在具有此行 -

的域中具有start()
RetrievalThread retrievalThread = grailsApplication.mainContext.getBean ('retrievalThread'). 

在我的单元测试中,我尝试了这个并且它起作用了(我将保留其他行,现在没有任何方位)。如果没有这一行,就会发生错误,说无法在null对象上获取mainContext,而是在谈论grailsApplication。

Def mainContext = Mock(ApplicationContext)
MainContext.getBean(_) >>{ name ->
return new MockRetrievalThread()}

模拟线程没有做任何事情。

此测试运行正常但是,此失败后的任何测试都会出现空指针异常且没有真实信息。看起来像一堆背景grails的东西。有没有办法清理它或使用比我正在使用的更好的东西?

2 个答案:

答案 0 :(得分:1)

我确信有一种方法可以在tearDown中清除它,但我认为还有更好的方法。

1。)我会使用DI而不是通过grailsApplication.mainContext.getBean;你有这样做的原因吗?

class MyController {
    def retrievalThread

    getFiles() {
        return [files: retrievalThread.getFiles(params.id)]
    }
}

2.a。)使用DI,您可以在测试中将控制器的retrievalThread设置为MockRetrievalThread的新实例。

void "test getFiles"() {
    given:
    controller.retrievalThread = new MockRetrievalThread()

    when:
    params.id = 1
    def returnedFiles = controller.getFiles() 

    then:
    // assertions
}

2.b。)或者完全跳过MockRetrievalThread并使用retrievalThread方法模拟mockFor bean,然后将模拟版本设置为控制器中的注入实例。

void "test getFiles"() {
    given:
    def retrievalThreadMock = mockFor(RetrievalThread)
    retrievalThreadMock.demand.getFiles { Integer input -> 
        return ['file1', 'file2', 'etc.']
    }
    controller.retrievalThread = retrievalThreadMock.createMock()

    when:
    params.id = 1
    def returnedFiles = controller.getFiles() 

    then:
    // assertions
}

答案 1 :(得分:-1)

您可以使用integration testing来运行整个应用,以避免任何未注入的bean。

grails create-integration-test org.bookstore.Book