在Spock中,如何消除“then”块中的重复交互?

时间:2016-08-10 05:37:44

标签: testing groovy spock

我正在使用Spock测试框架。我有很多测试结构与此类似:

def "test"() {
    when:
    doSomething()
    then:
    1 * mock.method1(...)
    2 * mock.method2(...)
}

我想将“then”块的代码移动到辅助方法:

def assertMockMethodsInvocations() {
    1 * mock.method1(...)
    2 * mock.method2(...)
}

然后调用此帮助器方法以消除规范中的代码重复,如下所示:

def "test"() {
    when:
    doSomething()
    then:
    assertMockMethodsInvocations()
}

但是,在将n * mock.method(...)放入辅助方法时,我无法匹配方法调用。以下示例演示:

// groovy code
class NoInvocationsDemo extends Specification {

    def DummyService service

    def "test"() {
        service = Mock()

        when:
        service.say("hello")
        service.say("world")

        then:
        assertService()
    }

    private assertService() {
        1 * service.say("hello")
        1 * service.say("world")
        true
    }

}

// java code
public interface DummyService {
    void say(String msg);
}

// [RESULT]
// Too few invocations for:
//
// 1 * service.say("hello")   (0 invocations)
//
// Unmatched invocations (ordered by similarity):
//
// 1 * service.say('hello')
// 1 * service.say('world')
//
// Too few invocations for:
//
// 1 * service.say("world")   (0 invocations)
//
// Unmatched invocations (ordered by similarity):
//
// 1 * service.say('world')
// 1 * service.say('hello')

如何从then:块中删除重复的代码?

1 个答案:

答案 0 :(得分:3)

实际上我找到了解决这个问题的简单方法。我们需要做的是在interaction块中包装辅助方法。

then:
interaction {
    assertService()
}