JUnit4および5で例外がスローされることをアサートする
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でから入手できます。