Я использую mockito в тесте junit. Как сделать исключение, а затем подтвердить, что оно имеет (общий псевдокод)
Я использую mockito в тесте junit. Как сделать исключение, а затем подтвердить, что оно имеет (общий псевдокод)
Ответы:
Сам по себе Mockito - не лучшее решение для обработки исключений, используйте Mockito с Catch-Exception
given(otherServiceMock.bar()).willThrow(new MyException());
when(() -> myService.foo());
then(caughtException()).isInstanceOf(MyException.class);
caughtException
?
com.googlecode.catchexception.CatchException.caughtException;
Сначала отвечу на ваш второй вопрос. Если вы используете JUnit 4, вы можете аннотировать свой тест с помощью
@Test(expected=MyException.class)
чтобы утверждать, что произошло исключение. А чтобы "издеваться" над исключением с помощью mockito, используйте
when(myMock.doSomething()).thenThrow(new MyException());
Если вы хотите проверить сообщение об исключении, вы можете использовать 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()
откуда это взялось?
Обновленный ответ от 19.06.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, аннотируйте свой метод тестирования с помощью:
@Test(expected = AnyException.class)
и выбросить желаемое использование исключения:
Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();
Сделайте исключение таким:
when(obj.someMethod()).thenThrow(new AnException());
Убедитесь, что это произошло, либо заявив, что ваш тест выдаст такое исключение:
@Test(expected = AnException.class)
Или с помощью обычной имитационной проверки:
verify(obj).someMethod();
Последний вариант необходим, если ваш тест предназначен для доказательства того, что промежуточный код обрабатывает исключение (т.е. исключение не будет выброшено из вашего метода тестирования).
verify
Утверждает ли вызов исключение?
when
предложение верное, оно должно было вызвать исключение.
Используйте doThrow от Mockito, а затем поймайте нужное исключение, чтобы утверждать, что оно было сгенерировано позже.
@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);
}
Используя mockito, вы можете сделать исключение.
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());
}
Пример можно найти здесь: assert exception junit
Вне зависимости от mockito, исключение можно поймать и подтвердить его свойства. Чтобы убедиться, что исключение действительно произошло, установите ложное условие в блоке try после оператора, который вызывает исключение.
Или если ваше исключение выброшено из конструктора класса:
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void myTest() {
exception.expect(MyException.class);
CustomClass myClass= mock(CustomClass.class);
doThrow(new MyException("constructor failed")).when(myClass);
}
Утверждение по сообщению об исключении:
try {
MyAgent.getNameByNode("d");
} catch (Exception e) {
Assert.assertEquals("Failed to fetch data.", e.getMessage());
}