如何使用JUnit测试两个迭代器的相等性?
是否有任何内置方法或只是通过比较其中的每个元素?
谢谢, 斯利拉姆
答案 0 :(得分:5)
您不能(也不必)测试迭代器的相等性,只测试底层集合的等式。要做到这一点,你可以迭代两个并依次比较每对元素,如你所猜测的那样。请注意,这有效地消耗了至少一个迭代器。结果取决于测试开始时迭代器的状态,因此这种方法很脆弱。因此,最好随时掌握底层集合并直接测试它们(使用equals
方法)。
为什么要测试两个迭代器的相等性?如果您解释具体问题,我们可能会提供更好的替代方案。
答案 1 :(得分:1)
没有理智的方法来测试Iterator
s的平等。
如果这是一个选项疯狂,你可能想深入研究你正在测试的特定迭代器类型的实现,并使用反射来访问私有东西并进行比较(我敢肯定,对源代码进行了充分的分析)代码,你会发现需要保持两个ListIterators相等的东西,例如)。
或者如果它是你自己的迭代器类型,那么导出一些帮助你的变量并使用它们而不是反射。
迭代和比较元素只是一个弱保证,因为你可以迭代你的集合的一个克隆,这意味着迭代器看起来一样,但不是。
请不要这样做。
答案 2 :(得分:0)
没有"经典"除了对象身份之外,Iterator
的平等概念,因为它们在最差的"中是可变的。一种方式。
在JUnit场景中,最好将值next()
返回到列表中,例如使用Guava的ImmutableList.copyOf(Iterator<T>)
,然后按照this SO answer
assertThat(a, is(b))