2016-11-14 71 views
1

我正在學習TDD,最近正在尋找如何正確測試私有方法的方法。 Stack Overflow中的流行答案提示:將私有方法更改爲受保護或包私有單元測試 - 好還是不好?

  • 使用反射可以使私有方法從外部訪問。 1
  • 不要測試私有方法。 (使用公共方法來代替。)123

根據註釋部分分歧,似乎每個人都有自己的規則。然後我發現這個tutorial site暗示了一個相當大膽的方法。

  • 製造private方法protectedpackage private。把測試代碼放在同一個軟件包中。

    設計的可測試性設計意味着你的代碼,使其更容易測試。要做到這一點,你可能不得不打破我們在大學學到的一些原則,比如封裝。

儘管TDD的原則設計代碼的可測試性,破壞了封裝爲不健全適合我。這種方法是一個好的方法嗎?

+0

如果一定要我選擇,我會選擇測試覆蓋率超過封裝的任何一天。 – Robert

+0

@羅伯特但是,由於每一種私人方法都迫使我選擇,是不是意味着不再有私人方法了? – user2652379

回答

2

我認爲正確的答案是:不要測試私有方法。 如果你覺得測試的私有方法,可能是以下兩種情況之一的需求正在發生:

  • 的方法還沒有被私人:也許它確定,該方法可以通過對象的API來達到它駐留在哪裏。在這種情況下,請將其更改爲公開(或其他任何不公開的內容)。另一種選擇是將方法的行爲放入另一個對象的公共方法中,然後爲其構建一些專門的測試;
  • 該方法必須是私有的,所以你正在測試你不應該的東西。您正在嘗試編寫與您正在測試的對象耦合的測試。私人方法根據定義並不穩定,它們可能在一段時間內頻繁變化。這些更改將打破每個直接驗證私有方法的測試。
+0

我不會像DTO那樣單元測試過於瑣碎的東西。但是「你正在測試的東西你不應該」對我來說有點新鮮。什麼樣的方法不應該被測試? – user2652379

+0

另一個問題。還有一些私人方法足夠複雜,無法進行測試。我應該怎麼做?如果可能的話,我的想法是將這種方法轉移到一個新班級,並將其公開化。也許有更好的方法?或者沒有解決方法,不應該測試? – user2652379

+0

我的意思是「你正在測試的東西你不應該」,可能你不需要爲私有方法內部的邏輯做一個特定的測試。也許你可以通過創建一個測試來測試私有代碼使用私有方法的代碼的公共方法。通過這種方式,您正在有效地測試對象的公共行爲,您正在測試某些屬於公共API的方法,因此根據定義,它必須是穩定的。但是,因此,您還在測試需要執行的私有代碼,以滿足上述「公共行爲」。 –

0

如果可以將Guava庫作爲依賴項添加,則可以使用方法package private並使用VisibleForTesting註釋標記它。

我假設你使用的是Java,但你並沒有明確指出。

相關問題