2013-04-27 57 views
3

我有一個用例,我試圖確保在我的類中調用特定方法時引發了抽象異常。使用Mockito是否可以拋出抽象異常?

我使用的Mockito要做到這一點,但已經注意到,是的Mockito根本就沒有拋出異常被調用方法時。

類來進行測試:

public void doSomething() throws CustomException { 
    try { 
    Collection<T> results = dao.getDatabaseResults(); 
     } catch (ProblemException e) { 
      throw new CustomException("There was an exception", e); 
    } 
} 

問題Exception類:

public abstract class ProblemException extends RuntimeException { 

    public ProblemException(String message) { 
     super(message); 
    } 

    public ProblemException(String message, Throwable e) { 
     super(message, e); 
    } 

測試類:

public testDoSomething() throws Exception { 
    CustomDAO mockDAO = Mockito.mock(CustomDAO.class); 

    Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException); 

    try { 
     foo.doSomething(); 
     Assert.fail(); 
    } catch (CustomException e) { 
     //Some more asserts 
    } 

目前上述測試類不能編譯,因爲你可以」創建一個抽象類的新實例。

我沒有獲得改變AbstractException類,我也不能更改由getDatabaseResults在DAO類()方法拋出的異常類型。

你對這個問題的乾淨的解決方案有什麼建議?

有一件事我能想到的是趕上我的doSomething()方法中的一個RuntimeException(如ProblemException擴展此類)。我只是好奇,如果有更好的方法?

感謝

回答

8

不能直接實例化一個抽象類,但你可以很容易地實例化一個匿名子類,因爲你不會被強迫定義任何方法這就是在這種情況下很簡單:

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException(){}); 

或者,你可以用另一種模擬:

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(Mockito.mock(ProblemException.class)); 

這將使意義,如果抽象類強制的其他方法,你的定義d不關心你的測試。

+0

非常好,非常感謝。不敢相信我之前沒有想過這樣做!我認爲我可能會採用第二個建議,以保護自己免受抽象類未來在某個時間添加其他方法的機會。 – JoshDavies 2013-04-27 14:53:40

+0

我的確認爲'thenThrow'也接受一個類。所以'Mockito.when(mockDAO.getDatabaseResults())。ThenThrow(ProblemException.class);' – bowmore 2013-04-28 08:31:00

相關問題