1. 引言

在这篇短文中,我们将关注一个常见问题:测试两个List实例是否包含完全相同的元素,且顺序完全相同。

ListJava文档)是一种有序数据结构,因此元素的顺序在设计上至关重要。

以下是List#equals方法的Java文档摘录:

…如果两个列表包含相同元素,并且顺序相同,则定义它们相等。

这个定义确保了equals方法在不同List接口实现之间能够正常工作。

我们在编写断言时可以利用这些知识。

在接下来的代码片段中,我们将使用以下列表作为示例输入:

List<String> list1 = Arrays.asList("1", "2", "3", "4");
List<String> list2 = Arrays.asList("1", "2", "3", "4");
List<String> list3 = Arrays.asList("1", "2", "4", "3");

2. JUnit

在纯JUnit测试中,以下断言将为真:

@Test
public void whenTestingForEquality_ShouldBeEqual() throws Exception {
    Assert.assertEquals(list1, list2);
    Assert.assertNotSame(list1, list2);
    Assert.assertNotEquals(list1, list3);
}

3. TestNG

当使用TestNG的断言时,它们看起来与JUnit非常相似,但重要的是要注意Assert类来自不同的包:

@Test
public void whenTestingForEquality_ShouldBeEqual() throws Exception {
    Assert.assertEquals(list1, list2);
    Assert.assertNotSame(list1, list2);
    Assert.assertNotEquals(list1, list3);
}

4. AssertJ

如果你喜欢使用AssertJ,其断言将如下所示:

@Test
public void whenTestingForEquality_ShouldBeEqual() throws Exception {
    assertThat(list1)
      .isEqualTo(list2)
      .isNotEqualTo(list3);

    assertThat(list1.equals(list2)).isTrue();
    assertThat(list1.equals(list3)).isFalse();
}

5. 总结

在这篇文章中,我们探讨了如何测试两个List实例是否包含相同元素并保持相同的顺序。这个问题的关键在于理解List数据结构的工作原理。

所有代码示例可以在GitHub上找到。