【问题标题】:Mocking Map parameter in Spock Framework Java testSpock Framework Java测试中的模拟地图参数
【发布时间】:2021-11-28 18:07:39
【问题描述】:

我很难在 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) 并有自己的行为。

【问题讨论】:

  • 不幸的是,这会返回:Groovy.lang.MissingMethodException: No signature of method:com.sun.proxy.$Proxy14.call() 适用于参数类型:(org.spockframework.lang.通配符,org.spockframework.lang.Wildcard) 值:[[_], [_]] 我从最后删除了“作为人”,它又恢复了工作,但显然我不能改变响应基于我传递给 call() 的内容。

标签: java unit-testing groovy spock


【解决方案1】:

当你使用一个对象作为参数时,Spock 将使用 Groovy 相等来比较参数。但是,如果构造引用对象过于复杂,您可以改用code argument constraints 以编程方式检查实际参数。

serviceClass.call({ it[PersonA] == attributeList }) >> MockReturnObject

由于您共享的代码很少,这是我能举出的最佳示例。

【讨论】:

  • 这是一个非常适合我用例的替代方案。我可以验证 map 参数是否包含特定的键并提供相应的模拟响应。非常感谢您的洞察力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多