【问题标题】:spock mocks: capture arg and stub return value - can be separate?spock 模拟:捕获 arg 和存根返回值 - 可以分开吗?
【发布时间】:2018-12-21 05:01:34
【问题描述】:

我有一个测试要求:

  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
    }
}

【问题讨论】:

    标签: mocking spock stubbing


    【解决方案1】:

    让我们咨询Spock documentation,好吗?

    结合模拟和存根

    模拟和存根齐头并进:

    1 * subscriber.receive("message1") >> "ok"
    1 * subscriber.receive("message2") >> "fail"
    

    当模拟和存根相同的方法调用时,它们必须发生在相同的交互中。特别是,以下将 stubbing 和 mocking 分成两个单独的语句的 Mockito 风格将不起作用:

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

    如“在何处声明交互”中所述,receive 调用将首先与 then: 块中的交互匹配。由于该交互未指定响应,因此将返回方法返回类型的默认值(在本例中为 null)。 (这只是 Spock 对嘲笑的宽容态度的另一个方面。)。因此,given: 块中的交互永远不会有机会匹配。

    注意

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

    【讨论】:

    • 这很难过。当您第一次阅读有关 spock 的内容时,他们会告诉您他们对可读性、清洁度等的重视程度。但是您会发现这一点,这使得对 spock 没有深入了解的人无法理解该测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多