有啥方法可以在 Spock 中进行模拟参数捕获
Posted
技术标签:
【中文标题】有啥方法可以在 Spock 中进行模拟参数捕获【英文标题】: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”中。
我想要参数的原因是因为我正在测试的对象应该接受我的输入参数,做一些事情,创建一个新对象并将那个传递给我的模拟对象。我想确保创建的对象看起来像它应该的样子。
非常感谢指针。
【问题讨论】:
为什么要存储参数?你会用它做什么? 我在上面澄清了为什么我需要它。 【参考方案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)
以上是关于有啥方法可以在 Spock 中进行模拟参数捕获的主要内容,如果未能解决你的问题,请参考以下文章
Grails / Spock:如何在类中模拟从类本身调用方法的单个方法?
如何在 Spock 控制器测试中模拟 Grails 请求对象方法
如何在 Grails 单元测试中使用 Spock 模拟 passwordEncoder