Spock-Test-Framework 中的模拟签名似乎不像文档中那样

Mock-Signature in Spock-Test-Framework seems not to be as in docs

在 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 都有几个签名,但如果它们有额外的参数,它们有一个映射作为第一个参数,然后是 class嘲笑,例如

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

现在,我有两个问题:

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

2) 在 IntelliJ 从 2017.3 更新到 2018.1 之后,我遇到了整个问题,之后 IntelliJ 拒绝接受 Subscriber(在上面的示例中)作为 SubscriberImpl 类型的对象,它在更新之前做了 -代码不变...如果我扭转局面并添加另一个支架和 "as Map",一切正常,因为这与 MockingApi 中的代码非常接近:

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

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

谢谢。

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

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

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

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

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