2010-07-21 58 views
16

可能重複: What’s the best way of unit testing private methods?我應該如何測試Java中的私有方法?

我是一個初學編程的,我不知道如何編寫一個應用程序,這將是單元測試結構良好。我想編寫應用程序,以便隨後添加有效的單元測試。

問題出在private方法 - 他們不能在他們的課外進行測試。

我應該通過更改所有方法privateprotected來解決此問題,並讓測試類擴展源類嗎?還是有更好的解決方案?

我的解決方案(私人splitLetters =>保護splitLetters)將這樣的工作:

源類:

class MyClass{ 
    protected splitLetters(int num){ 
    return num+2; 
    } 
} 

測試類:

class Test_MyClass extend MyClass{ 
    public splitLettersTest(){ 
    for(int i=0;i<100;i++){ 
    System.println(parent.splitLetters(i)); 
    } 
} 
} 

解決方案:

  1. 未測試私有方法 - 有時私有方法正在執行非常複雜的任務,應該進行非常好的測試,並且我們不希望該用戶有權訪問此方法。很快,解決方案正在將私有方法改爲受保護。

  2. 嵌套類的方式來測試 - 問題,因爲QA使源代碼更改

  3. 反思 - 如果這使得它可以調用私有方法,它看起來像一個很好的解決方案http://www.artima.com/suiterunner/private3.html (我應該學會更多的理解反思,我不明白如果我們可以從另一個類別調用私有方法,思考如何不打破所有的公共和私人方法的想法。)

  4. 沒有定義私人方法(正如我在我的解決方案中所展示的) - 存在問題,因爲有時我們必須定義私有方法。

+8

許多人會認爲私有方法不需要測試,只需要公開接口。 – David 2010-07-21 12:55:21

+1

重複的http://stackoverflow.com/questions/34571/whats-the-best-way-of-unit-testing-private-methods – onof 2010-07-21 12:57:12

+0

這個問題已經回答[這裏](http://stackoverflow.com/問題/ 34571 /單位什麼最最好的方式 - 的 - 測試 - 私有方法)。 – jevakallio 2010-07-21 12:55:56

回答

0

在我看來,私人方法不應該被測試。測試是爲接口(在這個詞的廣泛意義上)。

2

您不應該需要測試私有方法。當你測試你的公共方法時,理論上也應該測試你的私有方法。

25

您不應該需要測試私有方法。

  • 私有方法是具體實現的一部分。你不應該測試實現,而是測試功能。如果您測試某個類所公開的功能,則可以根據單元測試更改實現。
  • 如果您覺得需要測試一個私有方法,這是一個好兆頭,您應該將私有方法移動到另一個類並公開該方法。通過這樣做,您可以獲得更小的類,並且可以輕鬆測試這些方法。如果你不想公開這個新類,你可以使它成爲package-private(默認訪問修飾符)。
+2

+1對於爲什麼這是一個設計問題以及如何解決這個問題有一個很好的解釋。 – 2010-07-21 13:07:33

3

測試私有方法意味着測試實現,而不是功能。仔細想想爲什麼你想測試私有方法,你可能會發現你根本不需要測試它們。

3

我個人的觀點是,你應該(儘可能)只測試行爲暴露於那塊功能的最終用戶,因此,你不應該測試私有方法:

  1. 測試除了證明某個內部功能是「正常工作」的,根據某些對實際使用軟件的人毫無意義的內容來說,它並不能證明任何內容。

  2. 如果你改變/重新考慮你的內部實現,你會發現你的單元測試開始失敗,事實上外部功能暴露的根本沒有改變!

當然,你可以選擇了將大的項目進入功能更小的塊,在這種情況下,您可以選擇單元測試接口之間的接口(例如,你可以選擇單元測試數據訪問層,儘管DAL實施不會直接影響最終用戶)。