【问题标题】:Grails unit test using grailsApplication使用 grailsApplication 进行 Grails 单元测试
【发布时间】:2015-12-16 12:53:38
【问题描述】:

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

RetrievalThread retrievalThread = grailsApplication.mainContext.getBean ('retrievalThread'). 

在我的单元测试中,我尝试了这个并且它有效(我将省略其他现在没有影响的行)。如果没有这一行,则会出现错误,说无法在 null 对象上获取 mainContext,谈论 grailsApplication。 .

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

模拟线程不做任何事情。

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

【问题讨论】:

  • 我遇到了这个问题,grails\grailsApplication 在使用常规测试时没有被正确注入,通过集成测试运行整个应用程序解决了这个问题。你在使用集成测试吗?

标签: unit-testing grails


【解决方案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 并使用 mockFor 方法模拟 retrievalThread 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
}

【讨论】:

    【解决方案2】:

    您可以改用integration testing 来运行整个应用程序,以避免没有注入任何bean。

    grails create-integration-test org.bookstore.Book
    

    【讨论】:

    • 这并不是一个解决方案。单元测试有其自身的重要性,即一个单元单独工作是否完美。集成测试是为了确保这些单元在相互通信时运行良好并且没有错误的通信。
    • 我已经回答了这个问题..Is there a way to clean this up or use something better than what I'm using?,不需要投票,因为我的回答提供了另一种成功运行测试的方法,在获得 grails bean 的同时,集成是在测试对象和另一个 grails services\beans。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2013-02-07
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多