我想编写参数化测试,使用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)
是我想做的事情吗?
答案 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
闭包进行探索。您必须重新考虑如何设计测试,但您可以将交互卸载到可以为您创建交互的其他可恢复方法。