#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. Спасибо за вашу помощь…