JUnit 4および5で例外が発生したことをアサートする
1. 前書き
このクイックチュートリアルでは、JUnitライブラリを使用して、例外がスローされたかどうかをテストする方法を見ていきます。
もちろん、JUnit4とJUnit5の両方のバージョンをカバーするようにします。
参考文献:
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で入手できます。