我很难在Java项目中使用Spock框架进行测试。我有以下内容:
- Person.class
- Attribute.class
我有一个服务类,在我的测试中被嘲笑。我试图模拟的方法具有以下签名:
serviceClass.call(Map<Person, List<Attribute>> map)
当我纯粹使用通配符来模拟它时,如:
serviceClass.call(_) >> MockReturnObject
一切正常。服务类中的调用将返回mockreturnbject。
然而,对于我的特殊情况,我需要指定我传入的Person对象,并为它分配一个特定的mockreturnbject。如:
serviceClass.call([(PersonA):_)]) >> MockReturnObjectA
或
def listWildcard = _
serviceClass.call(Map.of(PersonA, listWildcard)) >> MockReturnObjectA
这两种方法都不起作用,调用最终返回null而不是mockreturnbjecta(我认为这是因为它未能匹配参数)。不幸的是,我对Spock没有太多经验,我试图在这种情况下搜索处理地图的文档,但没有取得成果。如果有人能提供指导,我将不胜感激。
我不认为这有什么区别,但是PersonA被传递给了serviceClass中的一个入口方法,就像;
List<Attribute> list = getAttributeList()
entryClass.process(List<Person> personList) {
personList.forEach(person -> serviceClass.call(Map.of(person, list))
}
在我的测试中,"when"是:
entryClass.process([PersonA, PersonB, PersonC])
所有三个都是Mock(Person.class),具有自己的行为。
当您使用一个对象作为参数时,Spock将使用Groovy相等性来比较参数。但是,如果构造引用对象太复杂,则可以使用代码参数约束来以编程方式检查实际参数。
serviceClass.call({ it[PersonA] == attributeList }) >> MockReturnObject
由于你只分享了很少的代码,这是我能给出的最好的例子。