在我的测试用例中,我使用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);
}