2010-01-12 90 views
11

我的開發團隊已經開始使用Mockito並且已經定義了「最終」類。我在Joshua Bloch的Effective Java中讀到過,在SO線程When to use final中,所有類都應該使用最終的修飾符。在這個線程中存在一些分歧,但我同意強制課程組成的想法,除非繼承是有意義的。Java最佳實踐與Mockito發生衝突時怎麼辦

我應該怎麼做時,我想使用像一個的Mockito測試框架,要求類沒有「最終」修改測試類?我希望別人在開發過程中遇到類似的問題。你的開發團隊做了什麼決議?

有兩個明顯的答案,例如使用JMock或在我們想測試的類上移除'final'修飾符,但我們想要堅持一個外部測試框架(除了JUnit),並且可能很難說服其他開發人員刪除'最終'修飾符。

謝謝。

+4

制定所有*類* final#肯定不是最佳實踐......自從閱讀Effective Java已經有一段時間了,但鏈接線程的共識當然似乎並不意味着這一點。你應該把類標記爲'final'來表示他們不應該被延長的一些原因 - 如果沒有理由,它就會增加不必要的複雜性 - 就像你發現的那樣。另外,如果您意識到您確實需要將課程擴展到某個地方,則必須更改原始課程的代碼以編寫新課程 - 違反開放/關閉原則。 – Nate 2010-01-13 03:38:43

回答

10

那你最需要的:

  1. ,以確保有人不從你的類繼承的能力,或
  2. ,以確保您的代碼是可測試使用的嘲弄的框架的能力選擇?

一般來說,我相信你不需要執行(1)。對我而言,可測性(2)更重要。最適合你的情況?

+0

可測性更重要恕我直言,我相信它符合我們的情況。 – austen 2010-01-13 19:28:27

+1

爲了「可測試性」,不需要犧牲設計。通過簡單地使用正確的工具來完成這項工作,你可以擁有兩者。在這種情況下,使用其中一個可以模擬最終方法和類的Java模擬工具:JMockit(我自己的工具)或PowerMock(它支持Mockito API,因此您不必完全重寫現有測試)。 – 2010-06-08 18:19:31

4

如果你希望你的類是最終的,你可以讓它們實現接口。接口是可嘲弄的。

4

正如在其他答案中已經提到的那樣,您可以讓您的最終課程實現 接口,並在您的測試中模擬接口(s)。

這是使用Mock對象的好處之一;在這種情況下,他們讓你思考如何更好地組織代碼。如果你的代碼庫有很多對最終類的引用(因此綁定到具體的實現),它違反了「編程到接口」的OO原則,並且需要更好的可測試性將幫助你考慮重構以消除對具體實現的依賴。

本文在模擬的使用對象Endo-testing: Unit Testing with Mock Objects有名爲接口發現一個部分(4.4),說明對象發現界面如何模擬幫助。

+0

我喜歡接口發現的想法。 – austen 2010-01-13 19:27:11

+3

當我編寫使用最終類的代碼並且該類沒有實現單獨的接口時,我*不*違反「程序到接口,而不是實現」GoF原則。該原則不*要求每個班級實施單獨的界面。對於那些願意真正閱讀它的人來說,GoF書的其他部分清楚地說明了這一點。 – 2010-06-08 18:24:04