Перейти к основному содержимому

Утверждения исключения AssertJ

· 2 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

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 .