首页 > 解决方案 > Spock-Test-Framework 中的模拟签名似乎不像文档中那样

问题描述

在 Spock-Docs 中,使用构造函数参数的 Mock/Spy/Stub 给出了这个签名:

def subscriber = Spy(SubscriberImpl, constructorArgs: ["Fred"])

(见:http ://spockframework.org/spock/docs/1.1/all_in_one.html#Spies ://spockframework.org/spock/docs/1.1/all_in_one.html#Spies )

然而,在 spock.mock.MockingApi 中,每个 Spy/Mock/Stub 都有几个签名,但如果它们有额外的参数,它们有一个 map 作为第一个参数,然后是要模拟的类,例如

public <T> T Spy(Map<String, Object> options, Class<T> type)

现在,我有两个问题:

1) 如果我使用文档中的顺序,Groovy/Spock 如何使测试工作?因为实际上,它有效...

2) 在 IntelliJ 从 2017.3 更新到 2018.1 之后,整个问题出现在我面前,之后 IntelliJ 拒绝接受订阅者(在上面的示例中)作为 SubscriberImpl 类型的对象,它在更新之前做了 - 代码不变......如果我扭转局面并添加另一个括号和“作为地图”,一切正常,因为这与 MockingApi 中的代码非常接近:

def subscriber = Spy([constructorArgs: ["Fred"]] as Map<String, Object>, SubscriberImpl)

但无论如何,如何通过更新改变行为以及它之前是如何工作的?也许有人可以解除我的困惑......?

谢谢。

标签: javaunit-testinggroovyspock

解决方案


将命名参数转换为映射是 Groovy 的内置功能,请参阅

至于为什么 IDEA 的行为像你描述的那样,我不知道。我也在使用 IDEA 2018 并看到相同的内容。搜索 JetBrains 错误数据库,如果尚不存在则创建一个。无论如何,这只是一种装饰性的东西,但如果能修好就好了。顺便说一句,由于方法签名如下所示,您还可以修复 IDE 的背景着色:

def subscriber = Spy(SubscriberImpl as Class, constructorArgs: ["Fred"])

或者像这样(更优雅,也更安全):

SubscriberImpl subscriber = Spy(constructorArgs: ["Fred"])

推荐阅读