assertThrows множественные исключения - PullRequest
0 голосов
/ 17 марта 2019

Может кто-нибудь сказать мне, как использовать 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 в целом

Есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Выдается единственное исключение, и оно имеет тип FunctionalException. cause этого FunctionalException является ConstraintViolationException.

Предполагая, что assertThrows - это метод JUnit 5 , он возвращает выброшенное исключение. Таким образом, вы можете просто получить его причину и добавить дополнительные проверки по этой причине.

1 голос
/ 17 марта 2019

Я предполагаю, что 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, потому что в нем много беглых методов.

...