java - 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)
但无论如何,如何通过更新改变行为以及它之前是如何工作的?也许有人可以解除我的困惑......?
谢谢。
解决方案
将命名参数转换为映射是 Groovy 的内置功能,请参阅
至于为什么 IDEA 的行为像你描述的那样,我不知道。我也在使用 IDEA 2018 并看到相同的内容。搜索 JetBrains 错误数据库,如果尚不存在则创建一个。无论如何,这只是一种装饰性的东西,但如果能修好就好了。顺便说一句,由于方法签名如下所示,您还可以修复 IDE 的背景着色:
def subscriber = Spy(SubscriberImpl as Class, constructorArgs: ["Fred"])
或者像这样(更优雅,也更安全):
SubscriberImpl subscriber = Spy(constructorArgs: ["Fred"])
推荐阅读
- c++ - 替代宏以帮助类型安全并减少重复
- apache-kafka - 如何在 Kafka 中为压缩主题设置无限保留?
- java - JavaMail - IMAP:A1 NO LOGIN 失败
- .net - Oracle ODP.Net的版本是否需要与数据库版本相匹配
- elasticsearch - 如何在 Elastic Search 中的嵌套对象上使用聚合?
- qt - 在事件循环之后执行信号
- amazon-web-services - 为什么 SQS ARN 的区域和账户 ID 不能为空?
- php - 这个简单的登录安全吗?
- python-3.x - “A”的最长连续运行
- python - 如何收集文件中关键字之间的所有数据行 - 在换行符处开始+结束