東西告訴我我做錯了什麼事......它不應該這麼難。從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;
}
}
是的,我的錯誤。正如你所建議的,它真正抱怨的是MyException。 InnerClass.go()被聲明爲拋出MyException(我把它留在上面的代碼中)。但是OuterClass.createInner()不。我認爲這不是導致問題的Mockito.doThrow()...這是對最終做到的.go()的調用。所以即使@test方法已經聲明拋出MyException,但這沒有幫助。 – DaveyBob 2011-04-15 17:26:05