如何在测试用例中处理Set的随机顺序?

时间:2017-06-27 19:05:32

标签: java unit-testing

在我的测试用例中,我使用assertEquals()进行单元测试。问题是这个断言的值来自HashSet,其中顺序是随机的。因此,每次运行测试用例时,由于HashSet的字符串表示形式值不同,我的断言可能会失败。

为了解决这个问题,我想在我的代码中使用LinkedHashSet,但这似乎不是一个有效的解决方案,因为LinkedHashSet的选择只是为了适应一些测试用例。

这是单元测试中的常见情况吗?

3 个答案:

答案 0 :(得分:6)

不要比较toString()的{​​{1}},而是将其与另一个(预期的)HashSet<T>进行比较。

以下测试将成功:

HashSet<T>

答案 1 :(得分:0)

  

每次运行测试用例时,由于HashSet的字符串表示值不同,我的断言可能会失败。

这意味着您不应该使用HashSet的“原始”字符串表示。

如果您想坚持比较字符串表示,请采用无序哈希集,对其进行排序,并对结果进行字符串表示。创建一个帮助方法,将哈希集转换为有序集合组件的字符串:

static <T extends Comparable<T>> String ordered(Set<T> set) {
    return set.stream().sorted().map(Object::toString).collect(Collectors.joining(", "));
}

您比较的字符串表示形式应包含按相同顺序排序的数据。现在比较两个字符串应该是可重复的:

assertEquals("1, 2, 3, 4, 5", ordered(obj.methodReturningHashSet()));

Demo.

答案 2 :(得分:0)

JUnit 5

测试Set是否包含一个(或多个)值,而不考虑顺序:

import static org.assertj.core.api.Assertions.assertThat;

class OrderUpdateHelperTest {
   @Test
   void testSetUnorderedContents () {
      Set<EventType> expectedTypes = Helper.getExpectedTypes(OrderStatus.IN_PROGRESS);

      assertThat(expectedTypes).containsExactlyInAnyOrder(EventType.A, EventType.B);
   }