Java: JUnit 例外が発生することを確認するテストの書き方の変遷


はじめに

JUnitでは、バージョンによってテストの書き方が異なります。

この記事では、例外が発生することを確認するテストの書き方を比較します。

JUnit 3

failメソッドが呼ばれるとテストに失敗するという仕様を利用します。

下記のサンプルコードの場合、getメソッド内でIndexOutOfBoundsExceptionが発生した場合は、catch句に入り、failメソッドは呼ばれません。このため、テストに成功するという仕組みになっています。

JUnit 4/5でもこの書き方は可能ですが、後述の書き方のほうが読みやすいでしょう。

public void testOutOfBounds() {
    try {
		List<Object> it = new ArrayList<>();
        it.get(1);
		fail();
	} catch (IndexOutOfBoundsException e) {
	}
}

JUnit 4

@Test アノテーションのexpected値を利用します。

@Test(expected = IndexOutOfBoundsException.class)
public void testOutOfBounds() {
	List<Object> it = new ArrayList<>();
	it.get(1);
}

JUnit 5

Assertions#assertThrowsを利用します。

JUnitの各assertメソッドでは、staticインポートを利用して、クラス名を省略するケースが多いです。

import static org.junit.jupiter.api.Assertions.assertThrows;

@Test
void testOutOfBounds() {
	List<Object> it = new ArrayList<>();
	assertThrows(IndexOutOfBoundsException.class, () -> it.get(1));
}