[英]Unit test private inner class methods
我有一個A類,它有一個由B類代表的內部Cache。這個內部類是私有的,因為緩存不需要對外部消費者可見,只是為了幫助外部類A.我使用的是Jmock和Java
public class A {
...
private class B {
...
public void testMethod() {
//The method I want to unit test
...
}
}
}
如上所示。 我不確定如何對來自私有內部類B的testMethod()進行單元測試(因為B類對於外部世界是不可見的)。
請指教!
謝謝!
因為緩存不需要對外部消費者可見
單元測試是外部消費者。 它是一個類,它調用被測對象的功能,就像任何其他類一樣。
警告: 關於這個問題有很多意見和爭論。 我在這里展示的不是“一個真正的答案”,而是基於我自己在代碼中維護單元測試的經驗。
不要直接對私人成員進行單元測試。 它不僅通常需要一點點詭計才能實現,它會在類之間創建耦合。 (測試類和正在測試的類。)暴露內部和耦合它們違反了面向對象的原則。
而不是根據您在類中調用的方法來考慮測試,而是根據您在單元上調用的功能來考慮測試。 無論該單元暴露什么功能,都應該測試什么。
這導致了一些結論:
由於使用該對象的代碼只能調用公共功能,因此測試該對象的代碼應僅驗證公共功能。
不建議對私有方法/類進行單元測試。測試調用私有方法的父方法就足夠了。盡管如此,你可以斷言/驗證私有類的影響。
例如,
如果你的內部類正在改變數據庫中的某個值,你可以調用父方法並且可以對db值進行斷言。這可以確保你的私有方法/私有內部類被測試。
參考: 單元測試私有方法
如果您嚴格遵循TDD方法,私有方法和私有內部類只是紅/綠/重構循環中重構步驟的結果。
所以方法應該是:
您將完成仍然經過全面測試的私有方法,但只能通過公共接口完成。
如上所述,你應該重新考慮為什么要測試一個私有方法,我不會再這樣做了,因為其他人已經給出了一些好的信息。
但是,如果仍需要測試私有方法,請使用反射“解鎖”私有方法,並使用Apache Commons避免編寫公共代碼(DRY - 不要重復自己) https:// commons。 apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/reflect/package-summary.html
如果需要模擬私有方法,例如在類的私有方法中完成的DB調用。 同樣最好的方法是重新設計它以便數據庫組件被抽象出來,但如果你必須這樣做,請考慮PowerMock
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.