AssertJ Исключения Утверждения
1. обзор
В этом кратком руководстве мы рассмотрим утверждения, относящиеся к исключениямAssertJ’s.
2. Без AssertJ
Чтобы проверить, было ли сгенерировано исключение, нам нужно перехватить исключение, а затем выполнить утверждения:
try {
// ...
} catch (Exception e) {
// assertions
}
Но что, если исключение не создается? В этом случае тест пройдет; Вот почему необходимо вручную не выполнять тестовые задания.
3. С AssertJ
Используя Java 8, мы можем легко делать утверждения об исключениях, используя выражения AssertJ и лямбда-выражения.
3.1. ИспользуяassertThatThrownBy()
Давайте проверим, вызывает ли индексирование элемента вне границ спискаIndexOutOfBoundsException:
assertThatThrownBy(() -> {
List list = Arrays.asList("String one", "String two"));
list(2);
}).isInstanceOf(IndexOutOfBoundsException.class)
.hasMessageContaining("Index: 2, Size: 2");
Обратите внимание, как фрагмент кода, который может вызвать исключение, передается как лямбда-выражение.
Конечно, мы можем использовать различные стандартные утверждения AssertJ, например:
.hasMessage("Index: %s, Size: %s", 2, 2)
.hasMessageStartingWith("Index: 2")
.hasMessageContaining("2")
.hasMessageEndingWith("Size: 2")
.hasMessageMatching("Index: \\d+, Size: \\d+")
.hasCauseInstanceOf(IOException.class)
.hasStackTraceContaining("java.io.IOException");
3.2. ИспользуяassertThatExceptionOfType
Идея похожа на пример выше, но мы можем указать тип исключения в начале:
assertThatExceptionOfType(IndexOutOfBoundsException.class)
.isThrownBy(() -> {
// ...
}).hasMessageMatching("Index: \\d+, Size: \\d+");
3.3. ИспользованиеassertThatIOException и других распространенных типов
AssertJ предоставляет оболочки для общих типов исключений, таких как:
assertThatIOException().isThrownBy(() -> {
// ...
});
И так же:
-
assertThatIllegalArgumentException ()
-
assertThatIllegalStateException ()
-
assertThatIOException ()
-
assertThatNullPointerException ()
3.4. Отделение исключения от утверждения
Альтернативный способ написания наших модульных тестов -writing the when and then logic in separate sections:
// when
Throwable thrown = catchThrowable(() -> {
// ...
});
// then
assertThat(thrown)
.isInstanceOf(ArithmeticException.class)
.hasMessageContaining("/ by zero");
4. Заключение
И вот мы здесь. В этой короткой статье мы обсудилиdifferent ways to use AssertJ for performing assertions on exceptions.
Как всегда, доступен код, относящийся к этой статьеover on Github.