回答
有没有一种理智的方式来测试Iterator
s的平等。
如果在这方面疯狂是一个选项,你可能想深入研究你正在测试的特定迭代器类型的实现,并使用反射来访问私人东西并比较它(我相信,有足够的分析源代码,例如,您会发现需要保持两个ListIterator相等的内容)。
或者如果它是你自己的迭代器类型,那么导出一些变量来帮助你,并使用它们而不是反射。
迭代遍历和比较元素只是一个很弱的保证,因为你可以迭代你的集合的一个副本,这意味着迭代器看起来是一样的,但不是。
只是不这样做。
>“...,因为你可以迭代你的集合的一个克隆,这意味着迭代器看起来是一样的,但不是。”< 你是什么意思的“克隆”?我看到开发人员在处理迭代器时可能有一个“底层集合”的问题,但迭代器可以不存在“集合”和“可迭代”存在。在测试场景中,检查迭代器的行为可能是有意义的,因为有时你只能无奈地处理给定的API,无论它设计得有多好。 – 2016-11-16 09:38:18
您可以准确复制原始集合和两个迭代器,指向同一位置的每个迭代器。如果你通过这些迭代器比较容器值,你会认为迭代器是*相等的,但实际上它们指向不同的集合。 – Irfy 2016-11-17 09:23:00
好的,所以你的想法是,当比较迭代器时,如果它们的底层集合是相同的,那么你只希望它们是平等的,这当然意味着这样的底层集合首先存在。 我不认为这是必要的,因为即使官方Javadoc将Iterator定义为“集合上的迭代器”(小写'c'),“Iterator”接口也提供没有办法访问收藏,但只有一个接一个的元素。因此,只给定一个“Iterator”,当定义相等时,我们甚至不可能谈论底层集合。 – 2016-11-29 10:36:36
你不能(和不需要)测试迭代器的平等,只有底层的集合。要做到这一点,您可以迭代两者,并按照您猜测的顺序依次比较每对元素。请注意,这有效地消耗了至少一个迭代器。结果取决于测试开始时迭代器的状态,所以这种方法很脆弱。因此,最好是掌握底层集合,并尽可能地直接测试它们是否相等(使用它们的方法equals
)。
为什么你会想要测试两个迭代器的相等性?如果你解释你的具体问题,我们可能会提供一个更好的选择。
除了对象身份之外,没有“经典”的平等概念,因为它们在“最差”类型中是可变的。
在JUnit场景中,最好将值next()
返回到列表中,例如,使用番石榴的ImmutableList.copyOf(Iterator<T>)
,然后按this SO answer
- 1. 测试两个PersistenceContexts是否相等
- 2. 测试两个对象是否相等
- 3. 两个映射迭代器是否指向相同的项目保证相等?
- 4. 这两个代码是否相等?
- 5. 如何测试两个电子邮件地址是否相等
- 6. 如何在xunit.net中测试两个对象是否相等?
- 7. 测试两个目录树是否相等
- 8. 如何测试python中两个对象是否相等?
- 9. 使用Easy68K测试两个数字是否相等
- 10. 测试两个对象在结构上是否相等?
- 11. 在R中,如何测试两个因素是否相等?
- 12. Python单元测试:测试两个角度是否几乎相等
- 13. 测试迭代器是否生成某个值
- 14. 测试ActiveSupport :: TimeWithZone对象是否相等
- 15. 测试C++迭代器
- 16. 如何JUnit测试一个迭代器
- 17. 确定两个复数是否相等
- 18. 检查两个位置是否相等
- 19. 这两个表达式是否相等
- 20. 检查两个“select”是否相等
- 21. 检查两个表是否相等
- 22. 比较两个DRIVER_OBJECT是否相等?
- 23. 检查两个向量是否相等
- 24. 确定两个对象是否相等
- 25. 这两个uml箭头是否相等?
- 26. s:迭代器测试,如果在某个迭代
- 27. 测试两个字符串是否相等给出奇数结果
- 28. 如何使用closedxml测试两个单元在excel中是否相等?
- 29. 对两个对象做些什么,测试结果是否相等
- 30. 分享迭代器是否可迭代?
中描述的
assertThat(a, is(b))
我不认为我曾经考虑过这个问题。 – 2012-03-17 19:34:55请记住,'Iterator'可以是任意长的(甚至是无限的)。如果有一种内置的方法用于测试两个迭代器的相等性,并且它在合理的时间内运行,我可以用它来生成有趣且可发布的数学证明。 – emory 2012-03-17 19:54:57
此外,测试内容是一种破坏性操作。 – OrangeDog 2017-07-14 15:18:46