我正在一个Junit测试中使用Mockito。如何让异常发生并断言它已经发生了(通用伪代码)?
首先回答你的第二个问题。如果你正在使用JUnit 4,你可以使用注解来为你的测试进行标注:
@Test(expected=MyException.class)
要断言异常已发生。使用Mockito“模拟”异常,请使用
when(myMock.doSomething()).thenThrow(new MyException());
Mockito单独处理异常并不是最好的解决方案,建议与Catch-Exception一起使用。
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
caughtException
? - Ararcom.googlecode.catchexception.CatchException.caughtException;
。 - Arar如果您使用的是Java 8,针对2015年6月19日更新答案(Updated answer),只需使用assertj。
使用assertj-core-3.0.0 + Java 8 Lambda表达式
@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的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"));
}
given()
这个函数是从哪里来的? - Mohammad Faisal如果您正在使用JUnit 4和Mockito 1.10.x,请在测试方法上加上注释:
@Test(expected = AnyException.class)
要抛出所需的异常,请使用:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
使用Mockito的doThrow,然后捕获所需的异常以断言稍后是否抛出。
@Test
public void fooShouldThrowMyException() {
// given
val myClass = new MyClass();
val arg = mock(MyArgument.class);
doThrow(MyException.class).when(arg).argMethod(any());
Exception exception = null;
// when
try {
myClass.foo(arg);
} catch (MyException t) {
exception = t;
}
// then
assertNotNull(exception);
}
when(obj.someMethod()).thenThrow(new AnException());
通过断言测试将抛出这样一个异常来验证这是否发生:
@Test(expected = AnException.class)
或者通过普通的模拟验证:
verify(obj).someMethod();
如果你的测试旨在证明中间代码处理异常(即该异常不会从你的测试方法中抛出),则需要选择后一种选项。
verify
调用会断言异常吗? - NilsHwhen
子句正确,它一定会抛出异常。 - Duncan Jones我认为这应该对你有所帮助。
assertThrows(someException.class,
()-> mockedServiceReference.someMethod(param1,parme2,..));
when(testingClassObj.testSomeMethod).thenThrow(new CustomException());
使用Junit5,您可以断言异常,确保在调用测试方法时抛出了该异常。@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());
}
在此处找到一个示例:断言异常JUnit
assertThrows(YourException.class, () -> yourLogic())