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

时间:2016-08-16 07:11:18

标签: spock

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

customerRepository.save({ Customer customer ->
        assert ...
        assert ...
    }) >> { ... some return value ... }

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

我不认为这是记录在案的,有人可以说这里的规则究竟是什么吗?

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

1 个答案:

答案 0 :(得分:6)

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

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

然而,这会让你的调用太少而且#34;如果验证失败,我发现在某些情况下会产生误导,通常难以调试。

或者,匹配实现中的所有参数和断言:

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

    return returnValue
}

这将为您提供非常具有描述性的断言错误。