ホーム › テスト(Testing) › Test-01: JUnit 5 基本
Test-01: JUnit 5 基本(@Test, @BeforeEach, @AfterEach)
JUnit 5(JUnit Jupiter)はJava の標準的なテストフレームワークです。@Test でテストメソッドを宣言し、@BeforeEach で各テスト前の初期化、@AfterEach で各テスト後のクリーンアップを行います。 JUnit 5 は Java 8 以上で利用できます。
JUnit 5 の主要アノテーション
JUnit 5 では、アノテーションを使ってテストの構造を定義します。 JUnit 4 と比べてアノテーション名が変わっている点に注意してください(例:@Before →@BeforeEach)。
| アノテーション | タイミング | 用途 |
|---|---|---|
| @Test | テストメソッドに付与 | このメソッドがテストであることを宣言 |
| @BeforeEach | 各テストメソッドの前 | Calculator のインスタンス生成など初期化処理 |
| @AfterEach | 各テストメソッドの後 | ファイルクローズ・null 代入などクリーンアップ |
| @BeforeAll | クラス内の全テスト実行前(1回のみ) | DB 接続など高コストな初期化(static メソッドが必要) |
| @AfterAll | クラス内の全テスト実行後(1回のみ) | DB 切断など高コストなクリーンアップ(static メソッドが必要) |
| @DisplayName | テストメソッド・クラスに付与 | テスト結果に表示する日本語の名前 |
| @Nested | 内部クラスに付与 | テストをグループ化して構造化 |
| @ParameterizedTest | パラメータ化テストに付与 | @CsvSource / @ValueSource などと組み合わせて複数の値でテスト |
| @TestFactory | 動的テスト生成メソッドに付与 | Stream<DynamicTest> を返してテストを動的に生成 |
主要なアサーションメソッド(Assertions クラス)
| メソッド | 検証内容 |
|---|---|
| assertEquals(expected, actual) | 期待値と実際値が等しいか |
| assertNotEquals(unexpected, actual) | 値が等しくないか |
| assertTrue(condition) | 条件が true か |
| assertFalse(condition) | 条件が false か |
| assertNull(object) | null か |
| assertNotNull(object) | null でないか |
| assertThrows(ExceptionClass, () -> ...) | 指定した例外が発生するか |
| assertAll("msg", () -> ..., () -> ...) | 複数のアサーションをまとめて検証(全部失敗を報告) |
サンプルコード
テスト対象クラス(Calculator)と、 JUnit 5 でのテストクラス(CalculatorTest)をコメントで示しています。 Java 8 版では基本的な @Test と@ParameterizedTest を紹介します。 Java 17 版では @Nested でテストをグループ化します。 Java 21 版では @TestFactory で動的テストを生成します。
よくあるミス・注意点
JUnit 4 と JUnit 5 のアノテーションを混在させない
JUnit 4 の @Before と JUnit 5 の @BeforeEach は別物です。 パッケージも異なります(org.junit vsorg.junit.jupiter.api)。 混在すると一方のアノテーションが無視されてテストが期待通りに動きません。 インポートを必ず確認してください。
@BeforeAll / @AfterAll は static メソッドに付与する
@BeforeAll と@AfterAll を付けるメソッドはstatic である必要があります(デフォルト)。static でない場合は@TestInstance(Lifecycle.PER_CLASS) を クラスに付けることで解決できます。
assertThrows は例外の型を正確に指定する
assertThrows(Exception.class, ...) のように 親クラスを指定すると、意図しない例外でもテストが通過してしまいます。assertThrows(ArithmeticException.class, ...) のように 具体的な例外クラスを指定してください。
テストする観点
- 加算・減算・乗算の正常系(正の数・負の数・ゼロ)が正しく計算されること
- 除算で 0 を渡したとき
ArithmeticExceptionが発生すること - 境界値テスト:
Integer.MAX_VALUEとInteger.MIN_VALUEを使った加算でオーバーフローが起きないか(または意図した挙動か) @BeforeEachで初期化した Calculator が各テストで独立していること(テスト間の状態漏れがないか)@ParameterizedTestで複数の入力値(正常値・境界値・異常値)を網羅していること