1. Обзор
В этом кратком руководстве мы рассмотрим утверждения AssertJ, посвященные исключениям.
2. Без AssertJ
Чтобы проверить, было ли выброшено исключение, нам нужно перехватить исключение, а затем выполнить утверждения:
try {
// ...
} catch (Exception e) {
// assertions
}
Но что, если исключение не выброшено? В этом случае тест будет пройден; вот почему необходимо вручную проваливать тестовые случаи.
3. С AssertJ
Используя Java 8, мы можем легко выполнять утверждения об исключениях, используя AssertJ и лямбда-выражения.
3.1. Использование assertThatThrownBy()
Давайте проверим, вызывает ли индексация элемента списка, находящегося за пределами границ, исключение IndexOutOfBoundsException:
assertThatThrownBy(() -> {
List<String> list = Arrays.asList("String one", "String two");
list.get(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. Отделение исключения от утверждения
Альтернативным способом написания наших модульных тестов является написание логики « когда»
и « тогда
» в отдельных разделах:
// when
Throwable thrown = catchThrowable(() -> {
// ...
});
// then
assertThat(thrown)
.isInstanceOf(ArithmeticException.class)
.hasMessageContaining("/ by zero");
4. Вывод
И вот мы здесь. В этой короткой статье мы обсудили различные способы использования AssertJ для выполнения утверждений об исключениях.
Как всегда, код, относящийся к этой статье, доступен на Github .