【问题标题】:spock: verifying interaction using closures as a parametersspock:使用闭包作为参数验证交互
【发布时间】:2016-05-02 15:08:07
【问题描述】:

我想编写使用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)

我想做的事可能吗?

【问题讨论】:

    标签: testing groovy jvm spock


    【解决方案1】:

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

    when:
    someService.request(1)
    
    then:
    1 * service.method1(2, 3)
    
    when:
    someService.request(2)
    
    then:
    1 * service.method1(4, 5, 6)
    

    您是否期待比上述两个更多的互动?

    【讨论】:

    • 这不会隔离调用:(
    • 这就像为每个案例编写一个单独的测试一样好。保持测试清晰,易于理解。
    • 当 request() 更改底层对象的状态时,这些更改可能会影响下一次 request() 调用。例如当用户可用的请求数量有限时
    【解决方案2】:

    问题在于 Spock 将闭包解释为模拟交互,但事实并非如此。通过让闭包返回模拟服务的交互,我知道您想要做什么,但这不是它的结果。

    您可以考虑简化您的测试,正如 dmahapatro 提到的那样,或者您可以探索使用内置的 spock interaction 闭包。您必须重新考虑如何设计测试,但您可以将交互转移到其他可以为您创建交互的可重复使用的方法上。

    【讨论】:

    • 我会感谢任何使用 interaction clusure 和“卸载交互”的伪代码示例
    猜你喜欢
    • 2014-07-15
    • 2020-11-08
    • 2016-09-13
    • 2015-07-10
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2023-02-15
    相关资源
    最近更新 更多