簡體   English   中英

單元測試私有內部類方法

[英]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方法,私有方法和私有內部類只是紅/綠/重構循環中重構步驟的結果。

所以方法應該是:

  1. 編寫測試類的公共接口的測試,包括此緩存行為,並編寫代碼以便隨時通過這些測試。 這將導致長公共方法和一些明顯僅與緩存相關的字段。
  2. 然后從long公共方法重構一些緩存相關的私有方法。
  3. 下一步應該是將私有緩存字段和方法移動到私有內部類。 每次重構后,測試都應該通過而不進行修改。

您將完成仍然經過全面測試的私有方法,但只能通過公共接口完成。

如上所述,你應該重新考慮為什么要測試一個私有方法,我不會再這樣做了,因為其他人已經給出了一些好的信息。

但是,如果仍需要測試私有方法,請使用反射“解鎖”私有方法,並使用Apache Commons避免編寫公共代碼(DRY - 不要重復自己) https:// commons。 apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/reflect/package-summary.html

如果需要模擬私有方法,例如在類的私有方法中完成的DB調用。 同樣最好的方法是重新設計它以便數據庫組件被抽象出來,但如果你必須這樣做,請考慮PowerMock

https://code.google.com/p/powermock/wiki/MockPrivate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM