2011-04-15 197 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