如何处理测试案例中的随机订单



在我的测试用例中,我使用assertequals((进行单位测试。问题在于,该断言的值来自主机,其中订单是随机的。因此,每次运行测试案例时,我的断言可能由于标签的不同字符串表示值而失败。

为了解决这个问题,我正在考虑使用我的代码中的linkedhashset,但这似乎不是一个有效的解决方案,因为链接hashset的选择仅仅是为了容纳某些测试用例。

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

不要比较HashSet<T>toString(),而是将其与另一个(预期的(HashSet<T>

进行比较

以下测试将成功:

@Test
public void test() {
    Set<Integer> set = new HashSet<Integer>(Arrays.asList(2, 1, 3));
    Set<Integer> expected = new HashSet<Integer>(Arrays.asList(3, 2, 1));
    assertEquals(set, expected);
}

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

这意味着您不应该使用HashSet的" RAW"字符串表示。

如果您想坚持比较字符串表示形式,请进行无序的哈希集,对结果进行排序,并对结果进行字符串表示。制作一个辅助方法,以将哈希设置转换为有序集组件的字符串:

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

演示。

junit 5

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

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

最新更新