比较2 List <string>,如果它们包含任何顺序的相同元素[JUnit - Asset]

时间:2017-10-17 10:31:16

标签: java list junit matcher

我想通过使用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)

4 个答案:

答案 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)