如何解决Junit:如何检查 2 个集合是否与不同顺序的元素相等?
我正在尝试使用断言检查两个集合是否相同。它们应该是相同的,即使它们的元素顺序不同。
这是我检查相等性的方法:
public static <T> void assertCollectionsAreEquals (Collection<T> expected,Collection<T> actual,String message) {
Assertions.assertEquals(expected,actual,message);
}
示例集合:
Collection <Integer> one = new ArrayList<Integer>();
Collection <Integer> two = new ArrayList<Integer>();
Collection <Integer> three = new ArrayList<Integer>();
one.add(1);
one.add(2);
two.add(1);
two.add(2);
three.add(2);
three.add(1);
所以我的收藏是这样的:
One:[1,2]
Two:[1,2]
Three:[2,1]
测试:
assertCollectionsAreEquals(one,two,"Not Equals");
assertCollectionsAreEquals(one,three,"Not Equals");
输出:
Exception in thread "main" org.opentest4j.AssertionFailedError: Not Equals ==> expected: <[1,2]> but was: <[2,1]>
如何使我的所有测试集合的测试成功?
解决方法
要检查两个集合的相等性,应该比较两个集合的大小,然后可以通过从集合 c2
的副本中删除集合 c1
中的元素,如果它为空来计算差异集合是相等的:
public static <T> boolean areCollectionsEqual(Collection<T> c1,Collection<T> c2) {
if (c1 == c2) return true;
if (c1 == null || c2 == null || c1.size() != c2.size()) {
return false;
}
Collection<T> tmp = new ArrayList<>(c1);
for (T item : c2) {
if (!tmp.remove(item)) {
return false;
}
}
return tmp.isEmpty();
}
这种方法允许比较不同类型的集合(例如 List
到 Set
)
那么常见的 assertTrue
/ assertFalse
可以用于测试:
public static <T> void assertCollectionsAreEqual(Collection<T> expected,Collection<T> actual,String message) {
Assertions.assertTrue(areCollectionsEqual(expected,actual),message);
}
public static <T> void assertCollectionsAreNotEqual(Collection<T> expected,String message) {
Assertions.assertFalse(areCollectionsEqual(expected,message);
}
Update Collection::removeAll
可能会在集合包含不同频率的相同元素的情况下产生不正确的结果。例如List.of (1,2,2)
和 List.of (1,1,2)
,因此被迭代 remove
替换。
在 JUnit 5 中没有现成的断言方法来实现这一点。您可以改用 Hamcrest:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
assertThat("Not Equals",one,containsInAnyOrder(two.toArray()));
assertThat("Not Equals",containsInAnyOrder(three.toArray()));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。