繁体   English   中英

Mocking Map Spock 框架中的参数 Java 测试

[英]Mocking Map parameter in Spock Framework Java test

我很难在 Java 项目中使用 Spock Framework 进行测试。 我有以下内容:

 - Person.class 
 - Attribute.class 

我有一个服务 class 在我的测试中被模拟了。 我试图模拟的方法具有以下签名:

serviceClass.call(Map<Person, List<Attribute>> map)

当我纯粹使用通配符来模拟它时:

serviceClass.call(_) >> MockReturnObject

一切都按预期工作。 服务 class 中的调用将返回 MockReturnObject。

但是,对于我的具体情况,我需要指定我传入的 Person object 并为其分配一个特定的 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)。

当您使用 object 作为参数时,Spock 将使用 Groovy 相等性来比较参数。 但是,如果构建引用 object 过于复杂,您可以使用代码参数约束来以编程方式检查实际参数。

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

由于您共享的代码很少,所以这是我能给出的最好的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM