我正在尝试编写一个比较两个arrayList的junit测试。我的问题是,当我从程序中获取信息创建一个arrayList时,信息以不同的顺序返回,因为它存储在无序结构中。因此,例如,我可能一次得到“a或b”,而下一次“b或a”。
当我和我的教授谈到这个问题时,他说可以使用||建立一个junit测试运算符,因此返回的数据将匹配“a或b”或“b或a”。我已经在网上寻找使用jun运算符或运算符的运算符,但一直无法找到。如果这确实可行,有人可以提供正确的格式吗?谢谢!
答案 0 :(得分:2)
你可能会这样做,但不要这样做。
单元测试应该是确定性的 - 测试操作应该每次都发出相同的输出。因此,单元测试中的陈述或代码气味。
看起来你真正关心的是a和b都在列表中。如果这就是你真正关心的,那么测试订单是一个比你需要更强的断言 - 这可能和弱者一样糟糕。
尝试重组事情,以便您可以这样做:
assertTrue(theList.contains(a));
assertTrue(theList.contains(b));
答案 1 :(得分:2)
这是Hamcrest收藏品变得非常有用的地方。
您可以使用
assertThat(theList, containsInAnyOrder(a, b))
执行您所关注的检查,干净,简洁,可读的代码,并在断言失败时提供丰富的描述。
答案 2 :(得分:1)
您可以在断言中执行以下操作:
assertTrue((result == a) || (result == b));
这允许您测试您的结果是a还是b。
答案 3 :(得分:1)
我会像这样实现这个断言:
public void assertEqualsUnordered(Collection<?> a, Collection<?> b) {
assertEquals(a.size(), b.size());
List<Object> aCopy = new ArrayList<Object>(a);
for(Object o : b) {
assertTrue(aCopy.remove(o));
// fails if this object wasn't present in aCopy,
// but if it succeeds, removes one of "o" from aCopy
}
}
这适用于任何集合,无论是列表,集合还是其他任何集合。
答案 4 :(得分:0)
你为什么不做像
这样的事情Collections.sort( theList );
assertEquals( expectedList, theList );
其中expectedList
具有正确的元素,按自然顺序排序。