断言等式 2 列表忽略顺序

2022-08-31 11:06:43

我相信这应该是一个非常简单的问题。但不知何故,我无法在谷歌中找到答案。

假设我有2个字符串列表。第一个包含“字符串 A”和“字符串 B”,第二个包含“字符串 B”和“字符串 A”(注意顺序差异)。我想用JUnit测试它们,以检查它们是否包含完全相同的字符串。

是否有任何断言可以检查忽略顺序的字符串的相等性?对于给定的示例 org.junit.Assert.assertEquals 抛出 AssertionError

java.lang.AssertionError: expected:<[String A, String B]> but was:<[String B, String A]>

解决方法是首先对列表进行排序,然后将其传递给断言。但我希望我的代码尽可能简单和干净。

我使用Hamcrest 1.3JUnit 4.11Mockito 1.9.5


答案 1

当你提到你使用Hamcrest时
所以我会选择一个集合 Matchers

import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;

public class CompareListTest {

    @Test
    public void compareList() {
        List<String> expected = Arrays.asList("String A", "String B");
        List<String> actual = Arrays.asList("String B", "String A");
        
        assertThat("List equality without order", 
            actual, containsInAnyOrder(expected.toArray()));
    }
    
}

答案 2

您可以将 List.containsAll 与 JUnit 的 assertTrue 结合使用,以检查第一个列表是否包含第二个列表中的每个元素,反之亦然。

assertEquals(expectedList.size(), actualList.size());
assertTrue(expectedList.containsAll(actualList));
assertTrue(actualList.containsAll(expectedList));

提示:
这不适用于列表中的重复项