2010-05-21 103 views
1

這是我對我們在單元測試時認爲是「單元」的懷疑。JUnit - 測試一個方法,然後調用幾個更多的方法

說我有這樣的方法,

public String myBigMethod() 
     { 
     String resultOne = moduleOneObject.someOperation(); 
     String resultTwo = moduleTwoObject.someOtherOperation(resultOne); 
     return resultTwo; 
     } 

和此myBigMethod((我單元測試用於someOperation()和someOtherOperation()seperately寫入))有點集成ModuleOne的和ModuleTWO中通過如上使用它們,

那麼,方法「myBigMethod()」仍然被視爲「單元」?

我應該爲這個「myBigMethod()」寫一個測試嗎?如果testSomeOperation()失敗,它也會導致testMyBigMethod()失敗...現在,testMyBigMethod()的失敗可能會顯示一個不太可能的結果,錯誤的正確位置。

導致兩次測試失敗的原因對我來說看起來不太好。但不知道有沒有更好的辦法......?在那兒 ?

謝謝!

+0

您不會將結果合併到您顯示的代碼中。 – 2010-05-21 20:59:17

+2

我已經使用someOperationOne()的結果作爲someOtherOperation()的一個參數 – stratwine 2010-05-21 21:04:04

+0

哦,對不起,我沒有明白。 – 2010-05-21 21:06:05

回答

2

myBigMethod()的測試應該測試結合的其他兩種方法的組合。所以,是的,如果它依賴的任何一種方法都失敗了,它應該會失敗,但它應該測試更多。在某些情況下,someOperation()someOtherOperation()可以正常工作,但myBigMethod()仍然可能會失敗。如果這是不可能的,那麼就沒有必要測試myBigMethod()

+0

謝謝!爲我澄清它..! :) – stratwine 2010-05-21 21:16:51

5

您想測試myBigMethod的邏輯而不測試依賴關係。

它看起來像myBigMethod的規格是:

  1. 呼叫moduleOneObject.someOperation
  2. 結果傳遞到moduleTwoObject.someOtherOperation
  3. 返回結果

測試的關鍵只是這種行爲是爲了打破moduleOneObject和moduleTwoObject的依賴關係。通常這是通過將依賴關係傳遞給構造函數(構造函數注入)中的待測試類或通過屬性(setter注入)來設置它們來完成的。

這個問題不僅僅是學術問題,因爲在實踐中,moduleOneObject和moduleTwoObject可能會外出並擊中外部系統,如數據庫。真正的單元測試不會影響外部系統,因爲這會使其成爲「集成測試」。