mocking - spock 模拟:捕获 arg 和存根返回值 - 可以分开吗?
问题描述
我有一个测试要求:
- 验证交互(调用方法,并使用正确的参数)
- mock 需要返回一些良性的返回值,以免触发任何副作用。
附加的代码可以做到这一点,但我想知道是否有更易读的方法。特别是,我认为将模拟位(#1)与存根位(#2)分开会很好。
有什么建议么?
谢谢!
def "foo"() {
setup:
Payload payload
Collaborator mock = Mock()
underTest.collaborator = mock
when: "doing something"
underTest.doSomething()
then: "collaborator's func is called once"
1 * mock.func(*_) >> { args ->
payload = args[0] // 1. capture arg for inspection
SOME_RETURN_VAL // 2. return a canned response
}
and: "collaborator is passed correct args"
with(payload) {
//...do some verification over payload
}
}
解决方案
让我们查阅Spock 文档,好吗?
结合模拟和存根
模拟和存根齐头并进:
1 * subscriber.receive("message1") >> "ok" 1 * subscriber.receive("message2") >> "fail"
当模拟和存根相同的方法调用时,它们必须发生在相同的交互中。特别是,以下 Mockito 风格的 stubbing 和 mocking 拆分为两个单独的语句将不起作用:
given: subscriber.receive("message1") >> "ok" when: publisher.send("message1") then: 1 * subscriber.receive("message1")
正如“在哪里声明交互”中所解释的,
receive
调用将首先与块中的交互进行匹配then:
。由于该交互未指定响应,因此将返回方法返回类型(null
在本例中)的默认值。(这只是 Spock 对嘲笑的宽容态度的另一个方面。)。因此,given:
块中的交互永远不会有机会匹配。笔记
同一方法调用的模拟和存根必须在同一交互中发生。
推荐阅读
- build - 让 CMake 构建但不安装外部项目
- javascript - 从 json 源导入图像 (create-react-app)
- android - 计算默认 buildToolsVersion
- python - Django/Python - 帮助移动 is_authenticated 和 user == model.user 查看
- jenkins - 在本地构建和运行良好的 Polymer 项目无法在 Jenkins 上构建并出现“无法加载导入”错误?
- mysql - mysqlimport --delete 的幕后发生了什么?auto_increment 值没有被重置
- c# - 实体框架脚手架控制器返回损坏的页面
- c# - DbNull 总是作为 C# Spring.NET 中 SQL Server 存储过程的返回值返回
- android - Recycler View 将项目始终放在顶部
- c# - 无法加载文件或程序集 Microsoft.ReportViewer.ProcessingObjectModel,版本 = 13.0.0.0