spock模拟:捕获arg和stub返回值-可以分开吗?

时间:2018-12-21 05:01:35

标签: mocking spock stubbing

我有一个测试要求:

  1. 验证交互作用(方法已调用,并带有正确的args)
  2. 模拟程序需要返回一些良性的返回值,以免触发任何副作用。

附带的代码可以做到这一点,但是我想知道是否还有一种更易读的方式。特别是,我认为最好将模拟位(#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
    }
}

1 个答案:

答案 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:块中的交互将永远不会有匹配的机会。

     

注意

     

同一方法调用的模拟和存根必须在同一交互中发生。

相关问题