在存入返回值时使用闭包验证调用参数

wuj*_*jek 4 spock

我有一个关于在带有闭包的模拟调用中验证参数的问题。有时我这样做:

customerRepository.save({ Customer customer ->
        assert ...
        assert ...
    }) >> { ... some return value ... }
Run Code Online (Sandbox Code Playgroud)

等等。例如,在闭包中有多个(但不是太多)断言,并且还想存根调用以返回某些内容。我发现上面的代码不起作用,我需要从闭包中返回真实值,否则我想返回的对象将不会返回,并且测试将在其他地方失败。

我不认为这是有据可查的,有人可以说这里的规则到底是什么?

编辑:实际上,我刚刚检查过,即使不存根返回值也需要返回真实值。

lae*_*ger 7

到目前为止,我知道验证参数的两种选择。要么就地匹配不需要断言的参数:

then:
1 * customerRepository.save({ it.id == 1 && it.name == "joe" }) >> returnValue
Run Code Online (Sandbox Code Playgroud)

但是,如果验证失败,这将给您“调用次数太少”,在某些情况下,我发现这会引起误解,并且通常很难调试。

或者,匹配所有参数并在实现中声明:

then:
1 * customerRepository.save(_) >> { Customer customer ->
    assert customer.id == 1
    assert customer.name == "joe"

    return returnValue
}
Run Code Online (Sandbox Code Playgroud)

这将给您非常描述性的断言错误。