Spock-Test-Framework 中的 Mock-Signature 似乎不像在文档中那样



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

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

(见:http://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 类型的对象,它在更新之前就这样做了 - 代码不变......如果我扭转局面并添加另一个括号和"作为 Map",一切正常,因为这与 MockingAPI 中的代码非常接近:

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

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

谢谢。

这是一个内置的 Groovy 功能,可将命名参数转换为地图,请参阅

  • 时髦的善良:命名参数转换为地图
  • 时髦的优点:使用 IntelliJ IDEA 将方法参数转换为命名映射参数

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

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

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

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

最新更新