一尘不染

AssertEquals 2列表忽略顺序

java

我认为那应该是一个非常简单的问题。但是不知何故我无法在Google中找到答案。

假设我有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


阅读 435

收藏
2020-09-08

共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()));
    }

}
2020-09-08