Java >> Java チュートリアル >  >> Tag >> assert

AssertJ 例外アサーション

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 を記述することです。 そしてそれから 別のセクションのロジック:

// when
Throwable thrown = catchThrowable(() -> {
    // ...
});

// then
assertThat(thrown)
  .isInstanceOf(ArithmeticException.class)
  .hasMessageContaining("/ by zero");

4.結論

そして、そこにいます。この短い記事では、AssertJ を使用して例外に対してアサーションを実行するさまざまな方法について説明しました。

いつものように、この記事に関連するコードは Github で入手できます。


Java タグ