Mockito如何模拟和断言抛出exception?
我在junittesting中使用mockito。 你如何使exception发生,然后断言它有(通用伪代码)
BDD样式解决scheme
单独Mockito不是处理exception的最佳解决scheme,请使用Mockito和Catch-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块中声明一个错误的条件。