1. 序章

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

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

2. JUnit 5

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

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

@Test
public void whenExceptionThrown_thenAssertionSucceeds() {
    Exception exception = assertThrows(NumberFormatException.class, () -> {
        Integer.parseInt("1a");
    });

    String expectedMessage = "For input string";
    String actualMessage = exception.getMessage();

    assertTrue(actualMessage.contains(expectedMessage));
}

予期された例外がスローされた場合 assertThrows は例外を返します。これにより、メッセージに対してもアサートできます。

さらに、このアサーションは、囲まれたコードがタイプNumberFormatExceptionまたはその派生タイプの例外をスローしたときに満たされることに注意することが重要です。

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

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

@Test
public void whenDerivedExceptionThrown_thenAssertionSucceds() {
    Exception exception = assertThrows(RuntimeException.class, () -> {
        Integer.parseInt("1a");
    });

    String expectedMessage = "For input string";
    String actualMessage = exception.getMessage();

    assertTrue(actualMessage.contains(expectedMessage));
}

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

3. JUnit 4

JUnit 4を使用する場合、@ Testアノテーションの期待される属性を使用して、アノテーション付きテストメソッドのどこかに例外がスローされることを期待することを宣言できます。

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

@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 値を解析しようとするコードは、「Forinputstring」というメッセージを含むNumberFormatExceptionになると断言しています。

4. 結論

この記事では、JUnit4とJUnit5の両方で例外をアサートする方法について説明しました。

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