2017-09-13 137 views
1

我正在爲我的一個應用程序編寫單元測試,作爲一個很好的練習,我嘗試使我的類中的所有方法儘可能私有,所以我最終可能會得到大多數是私有的類方法,幾個公共的,有時一些調用靜態方法(我的其他類或一些TextUtils等)java中的單元測試私有和靜態方法

我想知道如何去測試我所有的類只嘗試依靠Mockito和因爲Robolectric和Powermockito似乎在擴展單元測試應該完成的範圍。我應該忽略所有私有和靜態方法以及偶然調用某些靜態或私有方法的公共方法嗎?或者如何?

+2

這是兩個非常不同的問題。通常,應該通過公共接口間接測試私有成員,而靜態方法通常是可單獨測試的。 – chrylis

+0

謝謝@chrylis – kioli

回答

2

您正在測試的類中的所有私有方法應該由一些public/protected/package私有方法調用;否則它們是未使用的代碼。因此,只需專注於測試此應用的「客戶端代碼」可見的公共API。內部(私有方法)將作爲副作用進行測試/覆蓋,因爲它們實際實現了API指定的公共契約。

直接測試實現細節(私有方法)會使測試難以維護,並且代碼被測代碼更難以重構。

+0

謝謝你的答案。我其實想到了這一點,但在我腦海中聽起來有些不對勁,因爲如果我有一種公共方法,也稱爲私人方法,我測試前者來捕捉它們,它感覺我不再測試一個「單元」,而是一個「合奏「 – kioli

+1

單元測試中的」單元「並不總是那麼容易定義。但總的來說,如果您專注於測試您的類的公共接口並將實現細節保持良好封裝,我認爲從長遠來看,這會讓事情更輕鬆。如果你覺得私有方法正在做你想要特別測試的東西,也許這意味着這個邏輯應該在它自己的類中建模,然後可以(單獨)公開地對它們進行單元測試。 –

+0

@kioli *「感覺我不再是測試一個」單元「而是一個」合奏「」** ** - **這裏的問題是*什麼是**單元**?*我喜歡Roy Osherove的定義:*一個單元是一組代碼,它有相同的理由來改變。*這意味着一個單元可以是單一方法或幾個類。 –

2

注意:這只是一般信息,因爲您的問題沒有提供代碼進行評論。

由於私有方法通常不能在類之外訪問(反射完全是另一回事),並且通常會爲您的公共方法和受保護方法提供功能,所以您的單元測試只需測試您的公共方法和受保護的方法。如果你仔細選擇你的測試數據,你應該能夠行使大部分/所有的代碼。

您可以使用Mockito來嘲笑被測試類所需的任何依賴關係。您可以使用期望值(Mockito.when(...).thenReturn(...)Mockito.verify(mockedClass).method(...))來模擬外部功能或檢查被測試類是否按預期發出呼叫。

您可以使用斷言來檢查被測試的方法是否返回適當的值。

但請記住,具有高代碼覆蓋率的詳細單元測試很有可能在您第一次嘗試更改被測試類的內部實現時破壞。這是一個平衡的行爲,你需要找到正確的覆蓋水平,同時儘量減少測試的脆弱程度。

+0

感謝您的回答,我上面的回答評論爲什麼我認爲它可能是錯誤的跳過直接私人方法測試 – kioli