我想在两个列表上使用assertEquals()
list1
和 list2
。
问题是,我不想像assertEquals(list1, list2)
那样比较列表。这些元素是可以使用函数getId()
返回其 id 的对象,我想检查列表在 id 方面是否相等(有序!
我该怎么做?函数式编程是个好主意吗?
顺序使用对象的 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 顺序的对象,它将失败。
您可以将列表转换为 id 列表,然后比较它们:
return list1.stream().map(MyClass::getId).collect(Collectors.toList())
.equals(list2.stream().map(MyClass::getId).collect(Collectors.toList()));
这个问题与这个问题非常相似,因此您可以从那里获得更多想法。在我的回答中,您可以看到我提出的选项之一是创建一个可重用的实用程序方法来比较列表:
<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);
您可以使用 AssertJ 流畅的断言库。您的比较可能看起来像
// "id" need to be either a property or a public field
assertThat(list1).extracting("id").contains(list2);
我认为这个问题是这个的重复.如果你只想用id比较对象,更简单的方法是覆盖equals方法,因为框架使用它来断言两个对象是否相等。
我没有直接这样做,而是首先比较列表大小,然后比较每个元素。