我想在assertEquals()
和list1
两个列表中使用list2
。
问题是,我不想比较像assertEquals(list1, list2)
这样的列表。元素是可以使用函数getId()
返回其id的对象,我想检查列表在ID方面是否相等(有序!)。
我该怎么做?函数式编程是个好主意吗?
答案 0 :(得分:2)
您可以将列表转换为ID列表,然后进行比较:
return list1.stream().map(MyClass::getId).collect(Collectors.toList())
.equals(list2.stream().map(MyClass::getId).collect(Collectors.toList()));
此问题与this question非常相似,因此您可以从中获取更多想法。在my answer中,您可以看到我提议的其中一个选项是为列表比较创建可重用的实用程序方法:
<T, U> boolean equal(List<T> list1, List<T> list2, Function<T, U> mapper) {
List<U> first = list1.stream().map(mapper).collect(Collectors.toList());
List<U> second = list2.stream().map(mapper).collect(Collectors.toList());
return first.equals(second);
}
然后您需要写的是:
return equal(list1, list2, MyClass::getId);
答案 1 :(得分:2)
您可以使用AssertJ流畅的断言库。您的比较可能看起来像
// "id" need to be either a property or a public field
assertThat(list1).extracting("id").contains(list2);
答案 2 :(得分:1)
如果您按顺序使用对象的ID创建预期列表,例如
List<MyObject> expected = new ArrayList<>();
expected.add(myObject1); //with id = 1
expected.add(myObject2); //with id = 2
expected.add(myObject3); //with id = 3
assertEquals(expected, actual);
,那么如果实际列表中的对象具有不同的id顺序,则会失败。
答案 3 :(得分:0)
我将此问题视为this的副本。如果你想只用id比较对象,更简单的方法是覆盖equals方法,因为框架使用它来断言两个对象是否相等。
答案 4 :(得分:0)
我没有直接这样做,而是首先比较了列表大小,然后比较了每个元素。