gpt4 book ai didi

unit-testing - 使用 grailsApplication 进行 Grails 单元测试

转载 作者:行者123 更新时间:2023-12-02 14:50:13 24 4
gpt4 key购买 nike

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

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

在我的单元测试中,我尝试了这个并且它有效(我将省略其他现在没有影响的行)。如果没有这一行,则会出现错误,说无法在 null 对象上获取 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,您可以设置 Controller 的 retrievalThreadMockRetrievalThread 的新实例在你的测试中。
void "test getFiles"() {
given:
controller.retrievalThread = new MockRetrievalThread()

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

then:
// assertions
}

2.b.) 或者完全跳过 MockRetrievalThread 并模拟 retrievalThread bean 使用 mockFor方法,然后将模拟版本设置为 Controller 中的注入(inject)实例。
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
}

关于unit-testing - 使用 grailsApplication 进行 Grails 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com