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

Testing spock:使用闭包作为参数验证交互,testing,groovy,jvm,spock,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.met

我想编写一个参数化测试,它使用
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)

我想做的是可能的吗?

通过使用基于交互的测试,而不是试图使测试过程复杂化并使理解变得繁琐,可以轻松实现您想要实现的目标:

when:
someService.request(1)

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

when:
someService.request(2)

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

您是否期望比上述两种交互更多?

问题是斯波克将闭包解释为模拟交互,而事实并非如此。通过让闭包返回模拟服务的交互,我看到了您想要做的事情,但这并不是它的结果


<>你可以考虑简化测试,正如DMAMAPATRO所提到的,或者你可以使用内置的代码>交互< /COD>闭包进行探索。您必须重新考虑如何设计测试,但您可以将交互转移到其他可恢复的方法,这些方法也可以为您创建交互。

这不会隔离调用:(这相当于为每种情况编写单独的测试。保持测试清晰,易于理解。when request()更改基础对象的状态,这些更改可能会影响下一个request()调用。例如,当用户的可用请求数量有限时,我希望使用
交互
clusure和“卸载交互”的任何伪代码示例