#java #exception #mockito #juniper
#java #исключение #mockito #juniper
Вопрос:
Кто-нибудь может сказать мне, как использовать assertThrows с несколькими исключениями?
например, вот класс:
protected void checkViolation(Set<ConstraintViolation<EcritureComptable>> vViolations) throws FunctionalException {
if (!vViolations.isEmpty()) {
throw new FunctionalException("L'écriture comptable ne respecte pas les règles de gestion.",
new ConstraintViolationException(
"L'écriture comptable ne respecte pas les contraintes de validation",
vViolations));
}
}
и мой метод тестирования:
@Test
void checkViolation(){
comptabiliteManager = spy(ComptabiliteManagerImpl.class);
when(vViolations.isEmpty()).thenReturn(false);
assertThrows( ConstraintViolationException.class, () ->comptabiliteManager.checkViolation(vViolations), "a string should be provided!");
}
Я хотел бы сопоставить метод и полностью исключить ConstraintViolationException и FunctionalException
Есть идеи?
Спасибо
Ответ №1:
Генерируется единственное исключение, и оно имеет тип FunctionalException
. cause
Причиной этого FunctionalException
является ConstraintViolationException
.
Предполагая, что assertThrows
это метод JUnit 5, он возвращает сгенерированное исключение. Таким образом, вы можете просто получить его причину и добавить дополнительные проверки по этой причине.
Ответ №2:
Я предполагаю, что исключение ConstraintViolationException будет основной причиной исключения FunctionalException. В этом случае, чтобы проверить, что вызванное исключение имеет желаемую причину, вы можете сделать что-то вроде
Executable executable = () -> comptabiliteManager.checkViolation(vViolations);
Exception exception = assertThrows(FunctionalException.class, executable);
assertTrue(exception.getCause() instanceof ConstraintViolationException);
Другим, возможно, более чистым решением было бы использовать AssertJ и его API.
Throwable throwable = catchThrowable(() -> comptabiliteManager.checkViolation(vViolations));
assertThat(throwable).isInstanceOf(FunctionalException.class)
.hasCauseInstanceOf(ConstraintViolationException.class);
Вам пришлось бы импортировать методы из класса Assertions из AssertJ :
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.assertj.core.api.Assertions.assertThat;
Я рекомендую вам взглянуть на этот API, потому что в нем есть много гибких методов.