Утверждение конкретного исключения, содержащего поле

#java #assertj

Вопрос:

В настоящее время у меня есть тест, который пытается проверить конкретное исключение, которое выглядит следующим образом:

 assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .withCauseExactlyInstanceOf(ConstraintViolationException.class);
 

В исключении ConstraintViolationException есть поле constraintName , доступное через getter getConstraintName() , но я не нашел способа проверить это с помощью assertj.

Я мог бы представить себе что-то вроде следующего:

 assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .withCauseExactlyInstanceOf(ConstraintViolationException.class)
    .with("getConstraintName").isEqualTo("XXXX");
 

или есть другой способ добиться этого?

Ответ №1:

withCauseExactlyInstanceOf не изменяет тестируемый объект, но с havingCause() дальнейшими утверждениями может быть выполнено по причине.

В сочетании с asInstanceOf() и returns() проверка типобезопасности будет:

 assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .havingCause()
    .asInstanceOf(type(ConstraintViolationException.class))
    .returns("XXXX", from(ConstraintViolationException::getConstraintName));
 

Или без типовой безопасности, использование isInstanceOf и hasFieldOrPropertyWithValue :

 assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .havingCause()
    .isInstanceOf(ConstraintViolationException.class)
    .hasFieldOrPropertyWithValue("getConstraintName", "XXX")
 

Комментарии:

1. Спасибо за вашу помощь.

Ответ №2:

Может быть:

 .extracting(x -> ((ConstraintViolationException)x).getConstraintName())
.isEqualTo("XXXX");
 

Комментарии:

1. Спасибо за вашу помощь.

Ответ №3:

Решение @Eugene привело меня в нужное русло:

 assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xyrepository.save(xxx))
    .withCauseExactlyInstanceOf(ConstraintViolationException.class)
    .extracting(s -> ((ConstraintViolationException) (s.getCause())).getConstraintName())
    .isEqualTo("XXXX");
 

Решение @StefanoCordio выглядит также прекрасно…

Комментарии:

1. Спасибо за вашу помощь…