AssertJ Исключения

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.