有啥方法可以在 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 中进行模拟参数捕获的主要内容,如果未能解决你的问题,请参考以下文章

仅在 spock 中模拟基于调用次数的方法返回

Grails / Spock:如何在类中模拟从类本身调用方法的单个方法?

如何在 Spock 控制器测试中模拟 Grails 请求对象方法

如何在 Grails 单元测试中使用 Spock 模拟 passwordEncoder

使用 Spock 进行 Grails 测试 - 选择哪个模拟框架?

有啥方法可以捕获页面刷新并暂停它?