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で利用できます。