Grails集成测试模拟未清理

时间:2016-02-24 10:01:58

标签: grails

在我无法解决的两个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

1 个答案:

答案 0 :(得分:0)

首先,在集成测试中使用模拟具有不可预测的结果。

但是把它放在一边,你的第一个测试中controller.myService在哪里被实例化?我原以为调用controller = new CodeController()会绕过controller.myService的自动装配。