JUnit 4と5で例外が発生する

1.はじめに

このクイックチュートリアルでは、JUnitライブラリを使用して、例外がスローされたかどうかをテストする方法を調べます。

もちろん、JUnit 4とJUnit 5の両方のバージョンをカバーするようにします。

2. JUnit 5

JUnit 5 JupiterアサーションAPIでは、例外をアサートするための assertThrows メソッドが導入されました。

これは予想される例外の型と、ラムダ式を通してテスト中のコードを渡すことができる Executable 機能インターフェースを取ります。

@Test
public void whenExceptionThrown__thenAssertionSucceeds() {
    String test = null;
    assertThrows(NullPointerException.class, () -> {
        test.length();
    });
}

このアサーションは、囲まれたコードが NullPointerException 型またはその派生型のいずれかの例外をスローしたときに満たされることに注意してください。

つまり、 Exception を予期される例外タイプとして渡した場合、 Exception はすべての例外のスーパータイプであるため、スローされた例外によってアサーションは成功します。

RuntimeExceptionを予期するように上記のテストを変更した場合、 thisも成功します。

@Test
public void whenDerivedExceptionThrown__thenAssertionSucceds() {
    String test = null;
    assertThrows(RuntimeException.class, () -> {
        test.length();
    });
}

assertThrows() メソッドを使用すると、コードの特定の部分で _ _を使用できるため、例外アサーションロジックをよりきめ細かく制御できます。

3. JUnit 4

JUnit 4を使うときは、単に** @ Test アノテーションの expected__属性を使って、アノテーション付きテストメソッドのどこかで例外がスローされることを宣言することができます。

その結果、テストの実行時に指定された例外がスローされなかった場合、テストは失敗し、スローされた場合は合格します。

@Test(expected = NullPointerException.class)
public void whenExceptionThrown__thenExpectationSatisfied() {
    String test = null;
    test.length();
}

この例では、テストコードが__NullPointerExceptionになることを期待していると宣言しました。

例外がスローされると主張することだけに関心があるのであれば、これで十分です。

例外の他のプロパティを検証する必要があるときは、 ExpectedException ルールを使用できます。

例外の message プロパティを検証する例を見てみましょう。

@Rule
public ExpectedException exceptionRule = ExpectedException.none();

@Test
public void whenExceptionThrown__thenRuleIsApplied() {
    exceptionRule.expect(NumberFormatException.class);
    exceptionRule.expectMessage("For input string");
    Integer.parseInt("1a");
}

上記の例では、最初に ExpectedException ルールを宣言しています。それから、このテストでは、 Integer 値を解析しようとするコードが "For input string"というメッセージを含む NumberFormatException になることを主張しています。

4.まとめ

この記事では、JUnit 4とJUnit 5の両方を使用した例外の表明に焦点を当てて説明しました。

例の完全なソースコードは、https://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[GitHubで利用可能]です。