首页 > 解决方案 > spock 模拟:捕获 arg 和存根返回值 - 可以分开吗?

问题描述

我有一个测试要求:

  1. 验证交互(调用方法,并使用正确的参数)
  2. 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
    }
}

标签: mockingspockstubbing

解决方案


让我们查阅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:块中的交互永远不会有机会匹配。

笔记

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


推荐阅读