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

JUnit 4および5で例外が発生したことをアサートする

1. 前書き

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

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

参考文献:

JUnitでのテストの順序

JUnitテストをカスタムオーダーで実行する方法を学びます。

JUnit 4およびJUnit 5のアサーション

JUnit 4と5の両方のアサーションを見てください。

2. JUnit 5

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

これは、予期される例外のタイプと、ラムダ式を介してテスト対象のコードを渡すことができるExecutable関数型インターフェイスを取ります。

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

ここで重要なのは、this assertion is satisfied when the enclosed code throws an exception of type NullPointerException or any of its derived types.

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

上記のテストを変更してRuntimeException,を期待すると、これも合格になります。

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

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

3. JUnit 4

JUnit 4を使用する場合、注釈付きのテストメソッドのどこかに例外がスローされることを期待していることをuse the expected attribute of the @Test annotationで宣言できます。

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

@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値を解析しようとするコードは、「入力文字列の場合」というメッセージとともにNumberFormatExceptionになると主張しています。

4. 結論

この記事では、JUnit 4とJUnit 5の両方で例外をアサートすることに焦点を当て、取り上げました。

例の完全なソースコードは、over on GitHubで入手できます。