AssertJ утверждать на сообщении о причине
Есть ли способ при использовании AssertJ снова метод, бросающий исключение, чтобы проверить, что сообщение в причине равно некоторой строке.
В настоящее время я делаю что-то вроде:
assertThatThrownBy(() -> SUT.method())
.isExactlyInstanceOf(IllegalStateException.class)
.hasRootCauseExactlyInstanceOf(Exception.class);
и хотел бы добавить утверждение, чтобы проверить сообщение в основной причине.
1 ответ
Решение
Не совсем, лучшее, что вы можете сделать на данный момент, это использовать hasStackTraceContaining
, пример
Throwable runtime = new RuntimeException("no way",
new Exception("you shall not pass"));
assertThat(runtime).hasCauseInstanceOf(Exception.class)
.hasStackTraceContaining("no way")
.hasStackTraceContaining("you shall not pass");
Начиная с AssertJ 3.16 доступны две новые опции:
Throwable runtime = new RuntimeException("no way",
new Exception("you shall not pass"));
assertThat(runtime).getCause()
.hasMessage("you shall not pass");
Throwable rootCause = new RuntimeException("go back to the shadow!");
Throwable cause = new Exception("you shall not pass", rootCause);
Throwable runtime = new RuntimeException("no way", cause);
assertThat(runtime).getRootCause()
.hasMessage("go back to the shadow!");
Поскольку AssertJ 3.14, extracting
с участием InstanceOfAssertFactory
может быть использован:
Throwable runtime = new RuntimeException("no way",
new Exception("you shall not pass"));
assertThat(runtime).extracting(Throwable::getCause, as(THROWABLE))
.hasMessage("you shall not pass");
as()
статически импортируется из org.assertj.core.api.Assertions
а также THROWABLE
статически импортируется из org.assertj.core.api.InstanceOfAssertFactories
.