我有一个控制器,在save方法上调用一个线程来检索一些文件。该线程在具有此行 -
的域中具有start()RetrievalThread retrievalThread = grailsApplication.mainContext.getBean ('retrievalThread').
在我的单元测试中,我尝试了这个并且它起作用了(我将保留其他行,现在没有任何方位)。如果没有这一行,就会发生错误,说无法在null对象上获取mainContext,而是在谈论grailsApplication。
Def mainContext = Mock(ApplicationContext)
MainContext.getBean(_) >>{ name ->
return new MockRetrievalThread()}
模拟线程没有做任何事情。
此测试运行正常但是,此失败后的任何测试都会出现空指针异常且没有真实信息。看起来像一堆背景grails的东西。有没有办法清理它或使用比我正在使用的更好的东西?
答案 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