Java 如何处理测试用例中集合的随机顺序?
在我的测试用例中,我使用assertEquals()进行单元测试。问题是这个断言的值来自哈希集,其中的顺序是随机的。因此,每次运行测试用例时,由于HashSet的字符串表示值不同,我的断言可能会失败 为了解决这个问题,我正在考虑在代码中使用LinkedHashSet,但这似乎不是一个有效的解决方案,因为LinkedHashSet的选择只是为了适应一些测试用例Java 如何处理测试用例中集合的随机顺序?,java,unit-testing,Java,Unit Testing,在我的测试用例中,我使用assertEquals()进行单元测试。问题是这个断言的值来自哈希集,其中的顺序是随机的。因此,每次运行测试用例时,由于HashSet的字符串表示值不同,我的断言可能会失败 为了解决这个问题,我正在考虑在代码中使用LinkedHashSet,但这似乎不是一个有效的解决方案,因为LinkedHashSet的选择只是为了适应一些测试用例 这是单元测试中的常见情况吗?不要比较哈希集的toString(),而是将其与另一个(预期的)哈希集进行比较 以下测试将成功: @Test
这是单元测试中的常见情况吗?不要比较
哈希集的toString()
,而是将其与另一个(预期的)哈希集进行比较
以下测试将成功:
@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);
}
@测试
公开无效测试(){
Set=newhashset(Arrays.asList(2,1,3));
Set expected=newhashset(Arrays.asList(3,2,1));
assertEquals(设置,预期);
}
不要比较一个哈希集的toString()
,而是将它与另一个(预期的)哈希集进行比较
以下测试将成功:
@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);
}
@测试
公开无效测试(){
Set=newhashset(Arrays.asList(2,1,3));
Set expected=newhashset(Arrays.asList(3,2,1));
assertEquals(设置,预期);
}
每次运行测试用例时,由于HashSet
的字符串表示值不同,我的断言可能会失败
这意味着您不应该使用哈希集的“原始”字符串表示形式
如果您想坚持比较字符串表示,请获取无序散列集,对其进行排序,然后获取结果的字符串表示。创建用于将哈希集转换为有序集组件字符串的帮助器方法:
static <T extends Comparable<T>> String ordered(Set<T> set) {
return set.stream().sorted().map(Object::toString).collect(Collectors.joining(", "));
}
每次运行测试用例时,由于HashSet
的字符串表示值不同,我的断言可能会失败
这意味着您不应该使用哈希集的“原始”字符串表示形式
如果您想坚持比较字符串表示,请获取无序散列集,对其进行排序,然后获取结果的字符串表示。创建用于将哈希集转换为有序集组件字符串的帮助器方法:
static <T extends Comparable<T>> String ordered(Set<T> set) {
return set.stream().sorted().map(Object::toString).collect(Collectors.joining(", "));
}
JUnit 5
测试集合是否包含一个(或多个)值,不考虑顺序:
import static org.assertj.core.api.Assertions.assertThat;
类OrderUpdateHelperTest{
@试验
void testSetUnorderedContents(){
设置expectedTypes=Helper.getExpectedTypes(OrderStatus.IN\u PROGRESS);
assertThat(expectedTypes).ContainesExactlyInYorder(EventType.A,EventType.B);
}
JUnit5
测试集合是否包含一个(或多个)值,不考虑顺序:
import static org.assertj.core.api.Assertions.assertThat;
类OrderUpdateHelperTest{
@试验
void testSetUnorderedContents(){
设置expectedTypes=Helper.getExpectedTypes(OrderStatus.IN\u PROGRESS);
assertThat(expectedTypes).ContainesExactlyInYorder(EventType.A,EventType.B);
}
您能提供一些代码吗?如果哈希集大小相同,并且包含相同的成员,则哈希集是相等的。请参阅。字符串表示与比较集
s是否相等有什么关系?请提供一个。当然,这些问题可以解决。但不是这样的输入。我们这里没有向导。您能提供一些代码吗?哈希如果ets大小相同,并且包含相同的成员,则它们是相等的。请参阅。字符串表示与比较Set
s是否相等有什么关系?请提供一个。当然,这些问题可以解决。但不是这样的输入。我们这里没有向导。OP不是在询问如何比较集合是否相等吗?“这个断言的值来自一个HashSet
“那么?就断言集合的相等。顺序与此无关。@LewBloch这当然是一种方法。和大多数编程方法一样,它不是唯一有效的方法。OP不是在问如何比较集合的相等性吗?”此断言的值来自HashSet
“那么?就断言集合的相等性吧。顺序与此无关。@LewBloch这当然是一种方法。与大多数编程方法一样,它不是唯一有效的方法。在我的例子中,我必须断言矩阵类的集合为某个值,并且很难创建“预期”值。”要比较的哈希集。对我来说,比较字符串是最方便的方法。在我的情况下,我必须将矩阵类的一组断言为某个值,并且很难创建要比较的“预期”哈希集。对我来说,比较字符串是最方便的方法。