测试两个迭代器的相等性?

时间:2012-03-17 19:23:44

标签: java junit iterator junit4

如何使用JUnit测试两个迭代器的相等性?

是否有任何内置方法或只是通过比较其中的每个元素?

谢谢, 斯利拉姆

3 个答案:

答案 0 :(得分:5)

您不能(也不必)测试迭代器的相等性,只测试底层集合的等式。要做到这一点,你可以迭代两个并依次比较每对元素,如你所猜测的那样。请注意,这有效地消耗了至少一个迭代器。结果取决于测试开始时迭代器的状态,因此这种方法很脆弱。因此,最好随时掌握底层集合并直接测试它们(使用equals方法)。

为什么要测试两个迭代器的相等性?如果您解释具体问题,我们可能会提供更好的替代方案。

答案 1 :(得分:1)

没有理智的方法来测试Iterators的平等。

如果这是一个选项疯狂,你可能想深入研究你正在测试的特定迭代器类型的实现,并使用反射来访问私有东西并进行比较(我敢肯定,对源代码进行了充分的分析)代码,你会发现需要保持两个ListIterators相等的东西,例如)。

或者如果它是你自己的迭代器类型,那么导出一些帮助你的变量并使用它们而不是反射。

迭代和比较元素只是一个弱保证,因为你可以迭代你的集合的一个克隆,这意味着迭代器看起来一样,但不是。

请不要这样做。

答案 2 :(得分:0)

没有"经典"除了对象身份之外,Iterator的平等概念,因为它们在最差的"中是可变的。一种方式。

在JUnit场景中,最好将值next()返回到列表中,例如使用Guava的ImmutableList.copyOf(Iterator<T>),然后按照this SO answer

中的说明继续assertThat(a, is(b))