1.概述

有时在编写单元测试时,我们需要对列表进行顺序无关的比较。在这篇简短的教程中,我们将查看如何编写这样的单元测试的不同示例。

2.设置

按照# =列表Java文档中,如果两个列表以相同的顺序包含相同的元素,那么它们是相等的。因此,我们不能仅仅使用=方法,因为我们想做顺序不可知的比较。

在本教程中,我们将使用这三个列表作为我们测试的示例输入:

List first = array。asList(1, 3, 4, 6, 8);列表秒=数组。asList(8, 1, 6, 3, 4);列表第三个=数组。asList(1,3,3,6,6);

有不同的方法来做顺序不可知论比较。让我们一个一个来看看。

3.使用JUnit

JUnit是Java生态系统中用于单元测试的一个众所周知的框架。

我们可以使用下面的逻辑来比较两个列表的相等性assertTrueassertFalse方法。

这里我们检查两个列表的大小,并检查第一个列表是否包含第二个列表的所有元素,反之亦然。虽然这个解决方案有效,但它不是很可读。那么现在让我们来看看一些替代方案:

@Test public void whenTestingForOrderAgnosticEquality_ShouldBeTrue() {assertTrue(first.size() == second.size() && first. containsall (second) && second. containsall (first));}

在第一个测试中,先比较两个列表的大小,然后再检查两个列表中的元素是否相同。当这两种情况都出现时真的,我们的考验会通过的。

现在让我们看看一个失败的测试:

@Test public void whenTestingForOrderAgnosticEquality_ShouldBeFalse() {assertFalse(first.size() == third.size() && first. containsall (third) && third. containsall (first));}

相反,在这个版本的测试中,尽管两个列表的大小相同,但是所有的元素都不匹配。

4.使用AssertJ

AssertJ是一个开源的社区驱动库,用于在Java测试中编写流畅而丰富的断言。

要在我们的maven项目中使用它,让我们添加assertj-core依赖的pom.xml文件:

<依赖> < groupId > org。assertj assertj-core 3.16.1 

让我们编写一个测试来比较两个具有相同元素和相同大小的列表实例的相等性:

@Test void whenTestingForOrderAgnosticEqualityBothList_ShouldBeEqual() {assertThat(第一个).hasSameElementsAs(第二个);}

在这个例子中,我们验证第一个以任意顺序包含给定可迭代对象的所有元素。这种方法的主要限制是hasSameElementsAs方法忽略了副本。

让我们来看看我们的实际意思:

@Test void whenTestingForOrderAgnosticEqualityBothList_ShouldNotBeEqual(){列表a =数组。asList("a", "a", "b", "c");列表b =数组。asList(“a”、“b”、“c”);为了(a) .hasSameElementsAs (b);}

在这个测试中,虽然我们有相同的元素,但是两个列表的大小不相等,但是断言仍然为真,因为它忽略了重复的元素。为了让它工作,我们需要为两个列表添加一个大小检查:

为了(a) .hasSize (b.size ()) .hasSameElementsAs (b);

在方法之后添加两个列表大小的检查hasSameElementsAs确实会如预期的那样失败。

5.使用Hamcrest

如果我们已经在使用Hamcrest或者想要使用它来编写单元测试,下面是如何使用匹配器# containsInAnyOrder顺序不可知比较的方法。

要在我们的maven项目中使用Hamcrest,让我们添加hamcrest-all依赖在pom.xml文件:

<依赖> < groupId > org。hamcrest-all 1.3 

让我们看看测试:

@Test public void whenTestingForOrderAgnosticEquality_ShouldBeEqual() {assertThat(first, Matchers.containsInAnyOrder(second.toArray()));}

这里的方法containsInAnyOrder为。创建与订单无关的匹配器iterable,这与检查的结果相符可迭代的元素。这个测试匹配两个列表中的元素,忽略列表中元素的顺序。

幸运的是,这种解决方案没有遇到前一节中解释的相同问题,所以我们不需要显式地比较大小。

6.使用Apache Commons

除了JUnit、Hamcrest或AssertJ之外,我们可以使用的另一个库或框架是ApacheCollectionUtils。它为覆盖广泛的用例的通用操作提供实用方法,并帮助我们避免编写样板代码。

要在我们的maven项目中使用它,让我们添加commons-collections4依赖在pom.xml文件:

 common -collections s4  >4.4 

这是一个使用CollectionUtils:

@Test public void whentestingfororderagnosticequality_shouldbetrueifequalotherwisfalse () {assertTrue(CollectionUtils。isEqualCollection(一、二);assertFalse (CollectionUtils。isEqualCollection(first, third)); }

isEqualCollection方法返回真正的如果给定的集合包含完全相同的元素基数。否则,它将返回

7.结论

在本文中,我们探索了如何检查2的相等性列表实例,其中两个列表的元素顺序不同。

所有这些例子都可以找到在GitHub

通用的底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>看看这个课程
本文评论关闭!