2011-04-15 194 views
3

東西告訴我我做錯了什麼事......它不應該這麼難。從Mockito模擬投擲異常

我有一個依賴內部類的類。我通過一個受保護的方法創建了這個內部結構,這樣我就可以在測試中覆蓋它以提供模擬。我明白,要得到一個Mockito模擬對象從void方法拋出異常,我必須使用doThrow。

但我的問題是,編譯器抱怨對Mockito.doThrow()的調用拋出RuntimeException ...所以我必須添加一個throws子句的方法設置模擬。這是Mockito本身的錯誤嗎? doThrow正在宣佈將來會發生的事情,但不是在模擬的設置過程中。

我在OuterClass看起來像......

public class OuterClass { 
    protected InnerClass inner; 
    protected void createInner() { inner = new InnerClass(); } 
    protected doSomething() { 
    try { 
     inner.go(); 
    } catch (RuntimeException re) { 
     throw new MyException("computer has caught fire"); 
    } 
    } 
} 

而且我測試的代碼看起來像......

@Test(expected = MyException.class) 
public void testSomething() { 
    OuterClass outer = new TestOuterClass(); 
    outer.doSomething(); 
} 

public static class TestOuterClass extends OuterClass { 
    @Override 
    public void createInner() { 
    InnerClass mock = Mockito.mock(InnerClass.mock); 
    Mockito.doThrow(new RuntimeException("test")).when(mock).go(); // PROBLEM 
    inner = mock; 
    } 
} 

回答

1

能不能請您檢查,編譯器確實在抱怨一個RuntimeException

關於RuntimeException的事情是它在編譯時應該沒關係。我懷疑編譯器實際上是在抱怨MyException - 我認爲這是一個檢查異常,由編譯器注意到,這被doSomething()方法拋出。您應該能夠簡單地將throws MyException添加到測試方法中,然後由測試運行器捕獲。由於預期,測試跑步者將通過。

+0

是的,我的錯誤。正如你所建議的,它真正抱怨的是MyException。 InnerClass.go()被聲明爲拋出MyException(我把它留在上面的代碼中)。但是OuterClass.createInner()不。我認爲這不是導致問題的Mockito.doThrow()...這是對最終做到的.go()的調用。所以即使@test方法已經聲明拋出MyException,但這沒有幫助。 – DaveyBob 2011-04-15 17:26:05