在 Spock Framework Java 测试中模拟 Map 参数
Mocking Map parameter in Spock Framework Java test
我很难在 Java 项目中使用 Spock 框架进行测试。我有以下内容:
- Person.class
- Attribute.class
我有一项服务 class 在我的测试中被模拟。我试图模拟的方法具有以下签名:
serviceClass.call(Map<Person, List<Attribute>> map)
当我纯粹使用通配符模拟它时:
serviceClass.call(_) >> MockReturnObject
一切正常。服务 class 中的调用将 return MockReturnObject。
但是,对于我的具体情况,我需要指定我传入的 Person 对象并为其分配一个特定的 MockReturnObject。喜欢:
serviceClass.call([(PersonA):_)]) >> MockReturnObjectA
或
def listWildcard = _
serviceClass.call(Map.of(PersonA, listWildcard)) >> MockReturnObjectA
这两种方法都不起作用,调用结束时 returning 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),具有自己的行为。
当您使用对象作为参数时,Spock 将使用 Groovy 相等性来比较参数。但是,如果构造引用对象过于复杂,您可以使用 code argument constraints 来以编程方式检查实际参数。
serviceClass.call({ it[PersonA] == attributeList }) >> MockReturnObject
因为您共享的代码很少,所以这是我能给出的最好的例子。
我很难在 Java 项目中使用 Spock 框架进行测试。我有以下内容:
- Person.class
- Attribute.class
我有一项服务 class 在我的测试中被模拟。我试图模拟的方法具有以下签名:
serviceClass.call(Map<Person, List<Attribute>> map)
当我纯粹使用通配符模拟它时:
serviceClass.call(_) >> MockReturnObject
一切正常。服务 class 中的调用将 return MockReturnObject。
但是,对于我的具体情况,我需要指定我传入的 Person 对象并为其分配一个特定的 MockReturnObject。喜欢:
serviceClass.call([(PersonA):_)]) >> MockReturnObjectA
或
def listWildcard = _
serviceClass.call(Map.of(PersonA, listWildcard)) >> MockReturnObjectA
这两种方法都不起作用,调用结束时 returning 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),具有自己的行为。
当您使用对象作为参数时,Spock 将使用 Groovy 相等性来比较参数。但是,如果构造引用对象过于复杂,您可以使用 code argument constraints 来以编程方式检查实际参数。
serviceClass.call({ it[PersonA] == attributeList }) >> MockReturnObject
因为您共享的代码很少,所以这是我能给出的最好的例子。