2012-04-13 117 views
8

將私有方法更改爲受保護以進行JUNIT測試是一個不錯的主意。將私有方法更改爲受保護以進行測試

+0

爲什麼要這樣呢?在測試之前你改變了一些東西,我看不出有什麼理由呢? – Nanne 2012-04-13 13:23:07

+2

幾乎肯定不是一個好主意;如果你直接測試一個類的內部方法,你應該考慮將它們重構成一個單獨的類。 – 2012-04-13 13:24:19

+0

我在私有方法返回單元測試環境中不可用的某些資源的情況下完成了此操作,並且我想測試一些調用它的其他(非私有)方法。通過使其受到保護,我可以覆蓋它,以便它返回一些存根/模擬而不是不可用的資源。這意味着一個單元測試變得可行,我還沒有找到另一種方法,但它不是理想的。 – 2012-04-13 13:27:23

回答

9

有時候有用,是的。

如果類是可擴展的,請確保使方法最終。

另外,記錄該方法不應該被相同包的子類或外部類調用的事實。

我使用Guava @VisibleForTesting註釋來說明該方法實際上應該是私有的。

+0

感謝您打開我的眼睛@VisibleForTesting。我不知道這存在。它仍然覺得這有點不完美,因爲它僅僅爲了測試的目的而影響實現的語法,但它比暴露應該是私有的成員和方法要好。而限制測試接口方法似乎是一個過分嚴格,有時不切實際的限制。 – Lolo 2013-01-18 18:06:50

4

您可以將方法打包爲本地。

您可以使用反射調用私有方法,或者您可以決定不應該直接測試private方法,只能間接測試。

5

總的來說不是。單元測試的想法是測試單位。換句話說,接口方法的實現。 如果你想測試一個你不能「看到」的方法,這可能是一種代碼異味。也許你沒有把你的業務邏輯從UI代碼中分離出來。

所以最好的想法是重新考慮你的架構。但是,如果替代方法是不測試代碼,那麼保護這些方法是個好主意。

1

儘管您應該更喜歡按照@ user714965的建議進行重構,但PowerMock的MockPrivate可以在不打開私有方法的情況下進行模擬。

首先編寫測試通常會導致您不需要模擬私有方法的設計。