比较 2 List<String> 是否以任何顺序包含相同元素 [JUnit - Asset]
Compare 2 List<String> if they contain same elements in any order [JUnit - Asset]
我想通过使用 JUnit 创建单元测试来测试是否正确生成了一些字符串列表。
我有 2 个字符串列表(我代码中的一个列表是 private static final,比方说 list1),它们具有相同的元素(相同的元素可以相乘),但顺序不同:
List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("c","a","b");
assertThat(list1 , containsInAnyOrder(list2));
这不起作用,junit 测试 returns 第一个元素不匹配。
我可能用错了containsInAnyOrder
方法。
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
我不知道如何实现这个Matcher
。
我不想使用这种类型的函数,因为它只适用于少量元素:
containsInAnyOrder(T... items)
这取决于您是否期望有重复。
如果没有重复 1 个简单选项使用 Set
- 两个集合通过使用 equals() 和使用 assertEquals( setA, setB );
彼此相等
有更多 "primitive" 方法(对每个唯一值使用 HashMap
并比较每个值的重复)来执行此操作,但对于您正在寻找的内容,请检查 this answer
中找到了这段代码
assertThat(list1, containsInAnyOrder("c", "b", "a"));
测试列表的完整方法:
@Test
public void testAssertList() {
List<String> actual = Arrays.asList("a", "b", "c");
List<String> expected = Arrays.asList("a", "b", "c");
//All passed / true
//1. Test equal.
assertThat(actual, is(expected));
//2. If List has this value?
assertThat(actual, hasItems("b"));
//3. Check List Size
assertThat(actual, hasSize(3));
assertThat(actual.size(), is(3));
//4. List order
// Ensure Correct order
assertThat(actual, contains("a", "b", "c"));
// Can be any order
assertThat(actual, containsInAnyOrder("c", "b", "a"));
//5. check empty list
assertThat(actual, not(IsEmptyCollection.empty()));
assertThat(new ArrayList<>(), IsEmptyCollection.empty());
}
您的测试可能失败,因为 list1
实际上并不包含 list2
,但包含 list2
中的元素
您可以先对 List
进行排序,然后比较排序后的 List
。
List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("c","a","b",);
Collections.sort(list1);
Collections.sort(list2);
assertEquals( list1, list2 ); // true
到目前为止,这是最通用的解决方案,没有集合,额外排序,...
assertThat(list1, containsInAnyOrder(list2.toArray()));
但我还是想知道如何实现这个调用:
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
我想通过使用 JUnit 创建单元测试来测试是否正确生成了一些字符串列表。
我有 2 个字符串列表(我代码中的一个列表是 private static final,比方说 list1),它们具有相同的元素(相同的元素可以相乘),但顺序不同:
List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("c","a","b");
assertThat(list1 , containsInAnyOrder(list2));
这不起作用,junit 测试 returns 第一个元素不匹配。
我可能用错了containsInAnyOrder
方法。
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
我不知道如何实现这个Matcher
。
我不想使用这种类型的函数,因为它只适用于少量元素:
containsInAnyOrder(T... items)
这取决于您是否期望有重复。
如果没有重复 1 个简单选项使用 Set
- 两个集合通过使用 equals() 和使用 assertEquals( setA, setB );
有更多 "primitive" 方法(对每个唯一值使用 HashMap
并比较每个值的重复)来执行此操作,但对于您正在寻找的内容,请检查 this answer
assertThat(list1, containsInAnyOrder("c", "b", "a"));
测试列表的完整方法:
@Test
public void testAssertList() {
List<String> actual = Arrays.asList("a", "b", "c");
List<String> expected = Arrays.asList("a", "b", "c");
//All passed / true
//1. Test equal.
assertThat(actual, is(expected));
//2. If List has this value?
assertThat(actual, hasItems("b"));
//3. Check List Size
assertThat(actual, hasSize(3));
assertThat(actual.size(), is(3));
//4. List order
// Ensure Correct order
assertThat(actual, contains("a", "b", "c"));
// Can be any order
assertThat(actual, containsInAnyOrder("c", "b", "a"));
//5. check empty list
assertThat(actual, not(IsEmptyCollection.empty()));
assertThat(new ArrayList<>(), IsEmptyCollection.empty());
}
您的测试可能失败,因为 list1
实际上并不包含 list2
,但包含 list2
您可以先对 List
进行排序,然后比较排序后的 List
。
List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("c","a","b",);
Collections.sort(list1);
Collections.sort(list2);
assertEquals( list1, list2 ); // true
到目前为止,这是最通用的解决方案,没有集合,额外排序,...
assertThat(list1, containsInAnyOrder(list2.toArray()));
但我还是想知道如何实现这个调用:
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)