Mockito测试void方法会抛出异常

edw*_*yte 364 java exception mocking mockito

我有一个void返回类型的方法.它也可以抛出一些异常,所以我想测试那些被抛出的异常.由于同样的原因,所有尝试都失败了:

Stubber类型中的(T)方法不适用于参数(void)

任何想法如何让方法抛出指定的异常?

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 638

括号的位置很差.你必须使用

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
                                          ^
Run Code Online (Sandbox Code Playgroud)

并不是

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
                                                                   ^
Run Code Online (Sandbox Code Playgroud)

这在文档中有解释

  • doThrow(new Exception()).when(object).voidMethod(any()); (5认同)
  • @edwardmlyte这个Mockito不一致是我切换到[MoxieMocks]的原因之一(https://code.google.com/p/moxiemocks/wiki/MockingLibraryComparison) (4认同)
  • 提出另一个问题,包括测试代码,测试代码和异常的完整堆栈跟踪. (2认同)

Ond*_*ert 10

如果你想知道如何使用新的BDD风格的Mockito:

willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));
Run Code Online (Sandbox Code Playgroud)

  • 感谢您在这里发布此信息;如果该方法返回一个值: given(mockedObject.methodReturningAnObject()).willThrow(new Exception()); 如果该方法不返回任何内容: willThrow(new Exception()).given(mockedObject).methodReturningVoid(...)); 解释形式 javadoc:“Stubbing voids 需要与 {@link Mockito#when(Object)}(或 BDDMockito.given)不同的方法,因为编译器不喜欢括号内的 void 方法......” (2认同)

小智 5

当发生运行时异常时,我在尝试使用三个方法调用测试 @Retryable 时遇到问题,我这样做并为我工作。

     Mockito.doThrow(RuntimeException.class)
            .doThrow(RuntimeException.class)
            .doNothing()
            .when(youMockInstance)
            .methodToTest(<parameter if your method has>);
Run Code Online (Sandbox Code Playgroud)