我想通过使用JUnit创建单元测试来测试是否正确生成了一些字符串列表。
我有两个字符串列表(我的代码中的一个列表是私有静态final,让我们说是list1),它们具有相同的元素(相同的元素可以乘以),顺序不同:
List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("c","a","b");
assertThat(list1 , containsInAnyOrder(list2));
这不起作用,junit测试返回第一个元素不匹配。
我可能错误地使用了containsInAnyOrder
方法。
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
我不知道如何实施此Matcher
。
我不想使用这种类型的功能,因为它只适用于少量元素:
containsInAnyOrder(T... items)
答案 0 :(得分:3)
您可以先对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
答案 1 :(得分:1)
这取决于您是否希望有重复。
如果没有重复,1个简单选项正在使用Set
- 两个集合使用equals()并使用assertEquals( setA, setB );
还有更多&#34;原始&#34;方法(对每个唯一值使用HashMap
并比较每个唯一值的重复次数),但是对于您要查找的内容,请检查this answer
答案 2 :(得分:0)
我在tutorial about unit tests中找到了这段代码:
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
答案 3 :(得分:0)
到目前为止,这是最通用的解决方案,没有集合,额外的排序,......
assertThat(list1, containsInAnyOrder(list2.toArray()));
但我仍想知道如何实施此调用:
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)