mock Map参数在Spock框架Java测试



我很难在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

由于你只分享了很少的代码,这是我能给出的最好的例子。

最新更新