繁体   English   中英

使用Grails的Grails单元测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM