java - Spock Framework Java测试中的模拟地图参数
问题描述
我很难在 Java 项目中使用 Spock 框架进行测试。我有以下内容:
- Person.class
- Attribute.class
我有一个在我的测试中被嘲笑的服务类。我试图模拟的方法具有以下签名:
serviceClass.call(Map<Person, List<Attribute>> map)
当我纯粹使用通配符模拟它时:
serviceClass.call(_) >> MockReturnObject
一切都按预期工作。服务类中的调用将返回 MockReturnObject。
但是,对于我的具体情况,我需要指定要传入的 Person 对象并为其分配一个特定的 MockReturnObject。喜欢:
serviceClass.call([(PersonA):_)]) >> MockReturnObjectA
或者
def listWildcard = _
serviceClass.call(Map.of(PersonA, listWildcard)) >> MockReturnObjectA
这些方法都不起作用,调用最终返回 null 而不是 MockReturnObjectA (我认为这是因为它无法匹配参数)。不幸的是,我对 Spock 没有太多经验,并且我尝试在这种情况下搜索有关处理地图的文档的尝试并没有取得成果。我将不胜感激任何能够提供任何指导的人。
我认为这没有什么区别,但是 PersonA 被传递给了 serviceClass 中的一个条目方法,例如;
List<Attribute> list = getAttributeList()
entryClass.process(List<Person> personList) {
personList.forEach(person -> serviceClass.call(Map.of(person, list))
}
所以在我的测试中,“何时”是:
entryClass.process([PersonA, PersonB, PersonC])
所有 3 都是 Mock(Person.class) 与他们自己的行为。
解决方案
当你使用一个对象作为参数时,Spock 将使用 Groovy 相等来比较参数。但是,如果构造引用对象过于复杂,您可以使用代码参数约束来以编程方式检查实际参数。
serviceClass.call({ it[PersonA] == attributeList }) >> MockReturnObject
由于您共享的代码很少,这是我能举出的最好的例子。
推荐阅读
- node.js - nodeJS议程在特定日期开始工作
- php - 如何在管理后台的产品上添加两个新的额外选项卡
- c# - SyntaxNode.ContainsDiagnostics 不适用于您自己的诊断?
- java - 错误“必需:找到的字符串:字符串?” Kotlin 和 Android Studio
- wpf - 如何展平 WPF 边框以制作无缝表面?
- openshift - 环境变量名称中的连字符和/或句点导致问题
- eclipse - Eclipse with Groovy-eclipse not showing New > Groovy Class option
- c# - 将 PromptOptions 的 PromptStyler 类与 Microsoft.Bot.Builder #4.0 一起使用
- python - Selenium + Python + Chrome:同时添加_experimental_option和设置desired_capabilities
- java - 插入后休眠5更新