【问题标题】:Is there any way to do mock argument capturing in Spock有什么方法可以在 Spock 中进行模拟参数捕获
【发布时间】:2013-04-26 05:21:21
【问题描述】:

我环顾四周,尝试了不同的方法,但无济于事。互联网上的示例很少,恕我直言,非常简单。我的用例:

(下面的“itocNetworkHandler”是模拟的)

when: "we're doing stuff"
    StandardResponse response = cms.doCardStuff("123", "111", order)
....
then: "we get proper calls and response object"
    1 * cms.itocNetworkHandler.doNetworkCall(
            { it instanceof ReplacementRequestRecord
            }, StandardResponseRecord.class) >> record

我想将参数('it')存储到模拟上的“doNetworkCall”中。

我想要参数的原因是因为我正在测试的对象应该接受我的输入参数,做一些事情,创建一个新对象并将那个传递给我的模拟对象。我想确保创建的对象看起来像它应该的样子。

非常感谢指针。

【问题讨论】:

  • 为什么要存储参数?你会用它做什么?
  • 我在上面澄清了为什么我需要它。

标签: mocking spock


【解决方案1】:

您可以按如下方式捕获参数:

// must be declared before when-block (or inside Specification.interaction {})
def captured

when:
...

then:
1 * mock.doNetworkCall(...) >> { record, recordClass -> 
    // save the argument
    captured = record
    ...
}
// use the saved argument
captured == ...

也就是说,通常有一个更简单的解决方案,例如检查参数约束中的预期记录(例如...doNetworkCall( { it == ... } ))。

【讨论】:

  • 谢谢,工作。我不想在“it ==”等中使用它的原因是我想要进行大量检查,如果你明白我的意思,我认为最后有所有断言会更整洁。
  • 您可以将检查放入辅助方法中,并从参数约束中调用辅助方法。
  • 是的,这是可能的。我想我最终还是喜欢他们。在参数块中进行断言感觉有点“偷偷摸摸”,为了可读性,我最终喜欢它们。或者我只是不习惯这种行话。
  • 我发现无论在哪里定义变量,都无法在闭包之外访问捕获的参数。
  • 我不知道如何像示例代码中那样分解闭包中的参数。我不得不做1 * mock.doNetworkCall(_) >> { arguments -> captured = arguments.get(0)}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多