assertThrows множественные исключения

#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, потому что в нем есть много гибких методов.