比较 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

我在 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

中的元素

您可以先对 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)