我有一个测试要求:
- 验证交互(调用方法,并使用正确的参数)
- 模拟需要返回一些良性返回值,以免触发任何副作用。
附加的代码可以做到这一点,但我想知道是否有更易读的方法。特别是,我认为将模拟位 与存根位 分开会很好。
有什么建议吗?
谢谢!
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 风格的将存根和模拟拆分为两个单独的语句将不起作用:
given: subscriber.receive("message1") >> "ok" when: publisher.send("message1") then: 1 * subscriber.receive("message1")
如"声明交互的位置"中所述,
receive
调用将首先与then:
块中的交互匹配。由于该交互未指定响应,因此将返回方法返回类型的默认值(在本例中为null
)。(这只是斯波克宽容嘲笑方式的另一个方面。因此,given:
块中的交互将永远没有机会匹配。注意
同一方法调用的模拟和存根必须在同一交互中进行。