spock - 在 stub 返回值时使用闭包验证调用参数

标签 spock

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

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

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

我不认为这是记录在案的,有人能说一下这里的规则到底是什么吗?

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

最佳答案

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

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

但是,如果验证失败,这会给您“调用太少”,我发现在某些情况下会产生误导,并且通常更难调试。

或者,在实现中匹配所有参数和断言:
then:
1 * customerRepository.save(_) >> { Customer customer ->
    assert customer.id == 1
    assert customer.name == "joe"

    return returnValue
}

这会给你非常描述性的断言错误。

关于spock - 在 stub 返回值时使用闭包验证调用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38968658/

相关文章:

grails - 如何运行非Spock测试>?

gradle - 无法在单独的sourceSet中配置Gradle中的Spock测试

grails - 如何在我的域中模拟临时服务?

Grails Controller 单元测试通过命令行而不是 Intellij

grails - Spock 在接口(interface)中未显示的动态方法上抛出 MissingMethodException

grails - 在为 Grails 应用程序编写 Geb/Spock 测试时,您将如何封装用户的登录操作,以便可以在测试中重用它?

groovy - Spock - 模拟 Groovy 闭包方法?

grails - 测试受 Spring 安全保护的页面

java - Groovy - 不明确的处理程序方法

grails - 多个 when/then 与 where for each other