有可能使用|| java代码的junit测试中的运算符?

时间:2012-02-26 21:55:50

标签: java junit

我正在尝试编写一个比较两个arrayList的junit测试。我的问题是,当我从程序中获取信息创建一个arrayList时,信息以不同的顺序返回,因为它存储在无序结构中。因此,例如,我可能一次得到“a或b”,而下一次“b或a”。

当我和我的教授谈到这个问题时,他说可以使用||建立一个junit测试运算符,因此返回的数据将匹配“a或b”或“b或a”。我已经在网上寻找使用jun运算符或运算符的运算符,但一直无法找到。如果这确实可行,有人可以提供正确的格式吗?谢谢!

5 个答案:

答案 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具有正确的元素,按自然顺序排序。

相关问题