[英]Grails unit test using grailsApplication
我有一个控制器,在save方法上调用了一个线程来检索一些文件。 该线程在具有此行的域中具有start()-
RetrievalThread retrievalThread = grailsApplication.mainContext.getBean ('retrievalThread').
在我的单元测试中,我尝试了这一点并且奏效了(我将省略其他没有任何作用的行)。 如果没有这一行,就会发生一个错误,说不能在空对象上获取mainContext,谈论grailsApplication。 。
Def mainContext = Mock(ApplicationContext)
MainContext.getBean(_) >>{ name ->
return new MockRetrievalThread()}
模拟线程不执行任何操作。
该测试运行正常,但是此后的任何测试都将失败,并且会出现空指针异常且没有实际信息。 看起来像一堆背景grails的东西。 有没有办法清理或使用比我正在使用的更好的东西?
我敢肯定有一种方法可以在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
使用bean mockFor
方法,然后设置嘲笑版本注入的情况下在你的控制器。
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
}
您可以改用集成测试来运行整个应用程序,以避免注入任何bean。
grails create-integration-test org.bookstore.Book
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.