例如,我有一個樹數據結構public class Tree { class Node { //stuffs... } private Node root; // ...}我正在使用 junit4。在我的單元測試中,我想在需要遍歷樹的地方運行一些健全性檢查(例如,檢查二叉搜索樹屬性是否保留)。但是由于 是保留的,我不能在類之外遍歷它。rootprivate我能想到的是:根的 getter 可以防止引用本身被更改,但外部代碼仍可能會更改 中的字段。root測試不是數據結構本身的一部分,我真的不想把它放在類中。即使我這樣做,我也必須在測試完成后刪除它們。Tree請告訴我正確的做法,謝謝。
1 回答

慕尼黑8549860
TA貢獻1818條經驗 獲得超11個贊
您可以執行多項操作,其中有幾個選項是:
做一個公共getter(但這會破壞代碼封裝,只有在你由于某種奇怪的原因不能將測試放在同一個包中時才應該考慮)
編寫一個包專用 getter 并將測試放在同一個包中(可能是最佳解決方案)
使用反射來訪問值(不推薦)
我個人會選擇選項2(請參閱我的最后一段,了解我推薦的答案,因為我不會做上述任何一項)。這就是我們在工業中用來測試我們通常無法訪問的東西。它是微創的,它不會像公共獲取器那樣破壞封裝,也不需要你做侵入式反射代碼。
作為關于我們為什么不使用(3)的討論,我曾經參與過一個項目,其中首席開發人員決定在他的所有單元測試中完全這樣做。有數以萬計的單元測試,它們都使用反射來驗證事物。通過將它們從反射輔助庫中轉換出來,我們獲得了性能提升,這足以讓我們在運行單元測試時得到更快速的反饋。
此外,您應該問問自己是否需要進行此類測試。雖然測試很好,但理想情況下,你應該對你的東西的界面進行單元測試,而不是深入到膽量來斷言一切都有效。如果你需要重構你的類,這將使它變得非常痛苦,因為當你觸摸任何東西時,你會使一堆測試失效。因此,我建議只測試公共方法,并在測試中非常嚴格。
添加回答
舉報
0/150
提交
取消