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.

Другие вопросы по тегам