許多開發人員認爲測試私有方法是一個壞主意。然而,我發現的所有例子都基於私有方法是私有的想法,因爲調用它們可能會破壞內部對象的狀態。但這不僅是隱藏方法的理由。單元測試私有方法:門面模式
讓我們考慮Facade模式。我的班級用戶需要2種公共方法。他們會太大。在我的例子中,他們需要從數據庫的BLOB中加載一些複雜的結構,解析它,填充一些臨時COM對象,運行用戶宏來驗證和修改這些對象,並將修改後的對象序列化爲XML。單個metod的相當大的功能:-)這兩個公共方法都需要這些操作。所以,我創建了大約10個私有方法,並且有2個公有方法調用它們。其實,我的私人方法不一定是私人的,他們不會破壞實例的內部狀態。但是,當我不慣於測試私有方法,我有以下問題:
- 發佈它們意味着用戶的複雜性(他們有他們不需要選擇)
- 我無法想象TDD風格對於這樣一個大型的公共方法,當你要編寫500多行代碼只是爲了返回一些東西(甚至不是真正的結果)。
- 從數據庫中檢索這些方法的數據,並且測試數據庫相關的功能要困難得多。
當我測試的私有方法:
- 我不發表會混淆用戶的詳細信息。公共接口包括2種方法。
- 我可以工作在TDD風格(一步一步寫小方法)。
- 我可以使用測試數據覆蓋大部分類的功能,無需連接數據庫。
可能有人形容,我究竟做錯了什麼?我應該使用什麼樣的設計來獲得相同的獎金,而不要測試私人方法?
更新:在我看來,我已經提取了一切,我能夠到另一個類。所以,我無法想象我可以提取什麼。從數據庫加載由ORM層執行,解析流,序列化爲XML,運行宏 - 一切都由獨立類完成。這個類包含相當複雜的數據結構,搜索和轉換的例程,並且需要所有提到的實用程序。所以,我認爲別的東西是不能提取的;否則,它的責任(關於數據結構的知識)將在類之間分配。
所以,最好的方法來解決我看到現在分成兩個對象(門面本身和實物,與私有方法成爲大衆)和移動真實物體的某個地方,沒有人會嘗試找到它。在我的情況下(Delphi)它將是一個獨立的單元,在其他語言中它可能是一個單獨的名稱空間。其他類似的選項是2接口,感謝您的想法。
它看起來像已經有一個相同的問題,這一個:http://stackoverflow.com/questions/250692/how-do-you- unit-test-private-methods – 2009-01-08 20:22:28
不是它的笨蛋 – krosenvold 2009-01-08 20:39:17