Mockito如何模拟和断言抛出exception?

我在junittesting中使用mockito。 你如何使exception发生,然后断言它有(通用伪代码)

BDD样式解决scheme

单独Mockito不是处理exception的最佳解决scheme,请使用MockitoCatch-Exception

Mockito + Catch-Exception + AssertJ

given(otherServiceMock.bar()).willThrow(new MyException()); when(myService).foo(); then(caughtException()).isInstanceOf(MyException.class); 

示例代码

  • Mockito + Catch-Exception + Assertj完整示例

依赖

  • eu.codearte.catch的exception:捕获的exception:1.3.3
  • org.assertj:assertj核心:1.7.0

坏处

  • 只支持1.10.8的Mockito

先回答你的第二个问题。 如果您使用的是JUnit 4,那么可以使用JUnit 4进行注释

 @Test(expected=MyException.class) 

断言发生了一个例外。 并用mockito“嘲笑”一个exception,使用

 when(myMock.doSomething()).thenThrow(new MyException()); 

让exception发生像这样:

 when(obj.someMethod()).thenThrow(new AnException()); 

通过声明你的testing会抛出这样的exception来validation它是否已经发生:

 @Test(expected = AnException.class) 

或者通过正常的模拟validation:

 verify(obj).someMethod(); 

如果您的testing旨在certificate中间代码处理exception(即不会从您的testing方法抛出exception),则后一个选项是必需的。

如果你想testingexception消息,你可以使用JUnit的ExpectedException和Mockito:

 @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void testExceptionMessage() throws Exception { expectedException.expect(AnyException.class); expectedException.expectMessage("The expected message"); given(foo.bar()).willThrow(new AnyException("The expected message")); } 

更新了06/19/2015的答案(如果你使用的是java 8)

只要使用assertj

使用assertj-core-3.0.0 + Java 8 Lambdas

 @Test public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() { assertThatThrownBy(() -> myService.sumTingWong("badArg")) .isInstanceOf(IllegalArgumentException.class); } 

参考: http : //blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html

如果您使用的是JUnit 4,而Mockito 1.10.x则使用以下方法标注您的testing方法:

 @Test(expected = AnyException.class) 

并抛出你想要的exception使用:

 Mockito.doThrow(new AnyException()).when(obj).callAnyMethod(); 

使用mockito,你可以使exception发生。

when(testingClassObj.testSomeMethod).thenThrow(new CustomException());

使用Junit5,可以断言exception,断言在调用testing方法时是否抛出exception。

 @Test @DisplayName("Test assert exception") void testCustomException(TestInfo testInfo) { final ExpectCustomException expectEx = new ExpectCustomException(); InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> { expectEx.constructErrorMessage("sample ","error"); }); assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage()); } 

在这里find一个示例: 断言exceptionjunit

与mockito无关,人们可以捕捉到exception情况并对其属性进行资产pipe理。 要validationexception是否发生,在引发exception的语句之后,在try块中声明一个错误的条件。