2009-01-06 21 views
8

我正在使用依賴注入爲我的課程以外的代碼提供模擬測試。我發現自己一遍又一遍地寫了很多相同的代碼,因爲我需要模擬AuthProvider,ConfigurationManager等等,這些都在我想測試的方法中使用。該方法包含分支(if-then-else),因此我有多個測試來測試該方法的所有執行路徑。我正在多次實例化每個模擬(每種測試方法都有一次),但是想知道這是否是錯誤的方法? 此外,我對嘲笑和預設響應顯然主要是複製粘貼,因爲對每個方法調用AuthProvider.Authenticate()這樣的調用如何避免在單元測試中使用模擬代碼時出現重複代碼

在每種方法中,我設置了一個模擬存儲庫,並在每個方法的結尾我驗證模擬庫。我應該建立一些工廠來創造這些模擬,並設定他們的期望和回報價值,如果是這樣的話?

爲了實現mock我使用RhinoMocks。

回答

5

「多次實例化每個模擬」不是問題。對象是免費的。

只要確定你沒有多次定義模擬類。課程價格昂貴。

另外,您在TestCase中有一個「setUp」方法,它允許您創建所有測試使用的燈具。是的,它爲每個測試重建。不,這不是一個問題,除非它很痛苦地緩慢。

1

這是我拿..

我不會的情況下使用模擬......我會用一個工廠方法返回一個假的實現類和使用依賴注入來使用這個實現來代替。 。這樣你就可以避免重複,並且可以再次重新使用這個實現......再次這個工廠實現需要被正確地重構,即不重複。行爲..類似..做了一個在子系統中的方法,當我在SUT上執行一些操作時調用...並且稍後調用verify()來驗證這種行爲......還有一個好的關於Martin Folwer bliki的文章Mock Aren't Stubs

0

如EasyMock的記錄和重放框架失敗,如果您不設置模擬調用期望。但是像Mockito這樣的框架只需記錄所有的調用,並讓你只驗證那些重要的調用。所以你不必在所有測試中的所有方法上設置期望值。然後回到你在每個測試方法中實例化Mocks的問題,有比使用setUp()方法更好的方法。 Mockito提供了@Mock註釋。所以你聲明你的變量(如字段),如: @Mock存儲庫模擬

並且只需在setUp()中調用initMocks()。聲明的所有模擬對象都可以在您的測試中自動使用,而無需明確創建Mocks。

+1

「如果您不對模擬調用設置期望值,則像EasyMock這樣的記錄和重放框架會失敗。」 =>這是不正確的。包括EasyMock在內的所有模擬工具都允許開發人員具有「非嚴格」的期望。在EasyMock中,通過使用「createNiceMock()」方法創建一個「很好」的模擬來實現。 – 2009-08-12 21:58:16

2

假設你使用的是NUnit,你可以爲你的Mocks使用實例變量並在Setup/Teardown中重置它們。如果您看到重複的模式,那麼請執行您對生產代碼所做的操作:重構並提取幫助程序方法,以表達您嘗試實現的內容(如果根本沒有共同性,那麼生產代碼的設計存在問題)。

如果在安裝過程中有重要的部門,考慮爲您的生產班級編寫多個測試類。

最後,想想你的生產類是否太忙,應該將某些行爲提取出來給一個幫助對象。

傾聽測試!

+0

非常感謝你提供了一個富有洞察力的答案。我想知道如何去編寫生產類的多個測試類。我如何命名多個測試類? – Fadeproof 2009-05-29 10:30:20