【发布时间】: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