回答
有沒有一種理智的方式來測試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. 測試兩個對象是否相等
- 2. 這兩個代碼是否相等?
- 3. 使用Easy68K測試兩個數字是否相等
- 4. 如何在xunit.net中測試兩個對象是否相等?
- 5. 測試兩個對象在結構上是否相等?
- 6. 如何測試python中兩個對象是否相等?
- 7. Python單元測試:測試兩個角度是否幾乎相等
- 8. 測試迭代器是否生成某個值
- 9. 測試ActiveSupport :: TimeWithZone對象是否相等
- 10. 如何JUnit測試一個迭代器
- 11. 這兩個uml箭頭是否相等?
- 12. 檢查兩個向量是否相等
- 13. 確定兩個複數是否相等
- 14. 這兩個表達式是否相等
- 15. 檢查兩個位置是否相等
- 16. 檢查兩個「select」是否相等
- 17. 確定兩個對象是否相等
- 18. s:迭代器測試,如果在某個迭代
- 19. 測試兩個字符串是否相等給出奇數結果
- 20. 如何使用closedxml測試兩個單元在excel中是否相等?
- 21. 對兩個對象做些什麼,測試結果是否相等
- 22. 分享迭代器是否可迭代?
- 23. 是否有一個C#等價於STL輸出迭代器?
- 24. 使用迭代器求解數組求和問題並僅測試相等性
- 25. 測試一個向量的所有元素是否相等
- 26. 如何測試變量是否等於兩個值之一?
- 27. 確定語法是否是使用兩兩不相交測試
- 28. 每次兩個迭代器?
- 29. 迭代器是否失效?
- 30. python否則如果和相等測試
中描述的
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