在我无法解决的两个spock集成测试之间,我发现了一个奇怪的污染情况。我想我做错了什么,但我无法理解。
两个集成测试正在测试同一控制器的不同情况。在第一个我嘲笑服务,而在第二个我不嘲笑。
以下是两项测试的重要部分:
测试1:
// CodeControllerSpec.groovy
...
def controller = new CodeController()
def serviceMock = new MockFor(PollutingService)
serviceMock.demand.search(1) { a, b, c ->
return [id: 1]
}
controller.myService.pollutingService = serviceMock.proxyInstance()
controller.save()
...
then:
serviceMock.verify(controller.myService.pollutingService)
测试2:
// CodeEngineSpec.groovy
...
def controller = new CodeController()
controller.show()
...
then:
...
控制器和服务如下
// CodeController
class CodeController extends RestfulController<Code> {
def myService
def show() {
...
myService.execute()
...
}
}
// MyService
class MyService {
def pollutingService
def execute() {
...
pollutingService.search(a, b, c)
...
}
}
// PollutingService
class PollutingService {
def search(a, b, c) {
...
...
}
}
如果我一个接一个地运行这两个测试,它们都会通过但是,如果我一起运行它们,第二个就会失败
No more calls to 'search' expected at this point. End of demands.
我确定使用了第一个服务中的模拟(我已经逐行调试了代码),但我不知道为什么模拟在测试后没有被清除。 任何建议都非常受欢迎。
我使用的是grails 2.3.8
答案 0 :(得分:0)
首先,在集成测试中使用模拟具有不可预测的结果。
但是把它放在一边,你的第一个测试中controller.myService
在哪里被实例化?我原以为调用controller = new CodeController()
会绕过controller.myService
的自动装配。