spock:使用闭包作为参数验证交互

时间:2016-05-02 15:08:07

标签: testing groovy jvm spock

我想编写参数化测试,使用where:来验证是否调用了方法x。我想传递x作为参数。

之类的东西
when:
someService.request(input)
then:
1 * (closure.call(otherService))
where
input | closure
1     | {OtherService service -> service.method1(2, 3)}
2     | {OtherService service -> service.method2(4, 5, 6)}

但是我收到了一个错误:

Too few invocations for:

1 * (closure.call(otherService))   (0 invocations)

Unmatched invocations (ordered by similarity):

1 * otherService.deleteUserMessage(2,3)

是我想做的事情吗?

2 个答案:

答案 0 :(得分:3)

您尝试实现的目标可以通过使用基于交互的测试轻松完成,而不是试图使测试过程复杂化并使其难以理解:

when:
someService.request(1)

then:
1 * service.method1(2, 3)

when:
someService.request(2)

then:
1 * service.method1(4, 5, 6)

您是否期望与上述两者相比有更多的互动?

答案 1 :(得分:0)

问题在于Spock将闭包解释为一种模拟的互动,但它并不是。通过让闭包返回模拟服务的交互,我看到你想要做什么,但这不是它将如何发挥作用。

您可以考虑简化测试,如dmahapatro所述,或者您可以使用内置的spock interaction闭包进行探索。您必须重新考虑如何设计测试,但您可以将交互卸载到可以为您创建交互的其他可恢复方法。