Spock 模拟:捕获参数和存根返回值 - 可以分开



我有一个测试要求:

  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 风格的将存根和模拟拆分为两个单独的语句将不起作用

given:
subscriber.receive("message1") >> "ok"
when:
publisher.send("message1")
then:
1 * subscriber.receive("message1")

如"声明交互的位置"中所述,receive调用将首先与then:块中的交互匹配。由于该交互未指定响应,因此将返回方法返回类型的默认值(在本例中为 null)。(这只是斯波克宽容嘲笑方式的另一个方面。因此,given:块中的交互将永远没有机会匹配。

注意

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

相关内容

  • 没有找到相关文章

最新更新