我有一个测试要求:
附带的代码可以做到这一点,但是我想知道是否还有一种更易读的方式。特别是,我认为最好将模拟位(#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
}
}
答案 0 :(得分:1)
让我们咨询Spock documentation吧?
组合模拟和存根
嘲弄与相伴相伴:
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
)。 (这只是Spock宽大的嘲笑方法的另一个方面。)因此,given:
块中的交互将永远不会有匹配的机会。注意
同一方法调用的模拟和存根必须在同一交互中发生。