在我的测试用例中,我使用assertEquals()进行单元测试。问题是这个断言的值来自HashSet,其中顺序是随机的。因此,每次运行测试用例时,由于HashSet的字符串表示形式值不同,我的断言可能会失败。
为了解决这个问题,我想在我的代码中使用LinkedHashSet,但这似乎不是一个有效的解决方案,因为LinkedHashSet的选择只是为了适应一些测试用例。
这是单元测试中的常见情况吗?
答案 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()));
答案 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);
}