2013-03-04 75 views
2

我使用JUnit 4的Mockito,我想存根方法調用,以便它拋出一個異常:打樁檢查異常:如何處理異常

doThrow(MyException.class).when(myObject).foo(); 

的問題是,MyException是檢查異常,所以在這個語句中調用foo()會導致編譯器抱怨我必須處理異常或向我的方法添加一個throws子句。

所以我想知道什麼正確的方法來處理這種情況是?我的想法到目前爲止:

  1. 我使用它錯了,還有更好的方法來做到這一點。
  2. 我剛添加throws MyException到測試方法
  3. 我提取呼叫出剛剛吞嚥例外

例如另一種方法

private void givenFooThrowsAnException(MyObject myObject) { 
    try { 
     doThrow(MyException.class).when(myObject).foo(); 
    } catch (MyException e) { 
     // Required to stub a checked exception 
    } 
} 
+0

檢查foo()方法的簽名,是否應該拋出一個檢查異常?如果不是,你使用它錯了。拋出一個runtimeException,而不是你的測試。 – Manoj 2013-03-04 11:53:49

+5

我會選擇#2。添加拋出沒有錯誤例外的測試方法? – 2013-03-04 11:58:23

+1

myObject是一個依賴項,我將其注入到被測試的類中。我正在測試被測試類所採用的兩條路徑,其中一條發生在myObject.foo()拋出MyException時,這是一個檢查的異常。也許我誤解了你的觀點,但是我的問題不在於我說的doThrow(MyException.class),而是編譯器在這裏看到了對foo()的調用,這引發了必須處理的異常。但是,因爲這只是建立一個存根,異常實際上不會被拋出。 – DaveJohnston 2013-03-04 12:01:42

回答

2

雖然存根迫使您處理檢查的異常,但它實際上永遠不會拋出異常。最優雅的方法是聲明測試方法來拋出該異常。

這種方法只有一個警告。如果您的測試通過在@Test註釋中聲明它來驗證是否拋出了檢查的異常。

@Test(expected=MyException.class) 
public void test...() throws MyException { 
    //... 
} 

在如果你的磕碰被搞砸了,並不會拋出檢查型異常的話,它可能會產生,可能會失敗通過的測試。

另外,你可以簡單地use unchecked exceptions