【プログラミング】【java】JUnit4とJUnit5の違い - j-komatsu/myCheatSheet GitHub Wiki

【テスト】JUnit4とJUnit5の違いと使い方

✅ 概要

JUnit(読み方:ジェイユニット)は、Javaアプリケーションの単体テストフレームワークです。
JUnit4とJUnit5には多くの違いがあります。


📊 JUnit4 vs JUnit5 比較表

比較項目 JUnit4 JUnit5(正式名:JUnit Jupiter)
アノテーション構文 @Before, @After, @Test @BeforeEach, @AfterEach, @Test
パッケージ構成 単一モジュール 3モジュール(Platform, Jupiter, Vintage)
拡張性 限定的 高い(@ExtendWith, Extension API)
パラメータ付きテスト 外部ライブラリが必要 標準サポート(@ParameterizedTest
テスト無効化 @Ignore @Disabled
Javaバージョン依存 Java5以降 Java8以降
複数のアサーション 1つずつ記述 assertAll()でまとめて記述可能

1. アノテーション構文の違い

✅ JUnit4

import org.junit.Before;
import org.junit.After;
import org.junit.Test;

public class SampleTest {

    @Before
    public void setUp() {
        System.out.println("前処理");
    }

    @After
    public void tearDown() {
        System.out.println("後処理");
    }

    @Test
    public void testLogic() {
        System.out.println("テスト本体");
    }
}

✅ JUnit5

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

class SampleTest {

    @BeforeEach
    void setUp() {
        System.out.println("前処理");
    }

    @AfterEach
    void tearDown() {
        System.out.println("後処理");
    }

    @Test
    void testLogic() {
        System.out.println("テスト本体");
    }
}

2. テスト無効化

✅ JUnit4

import org.junit.Ignore;
import org.junit.Test;

public class IgnoreExample {

    @Ignore("未実装のためスキップ")
    @Test
    public void skippedTest() {
        // 実行されない
    }
}

✅ JUnit5

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

class DisabledExample {

    @Disabled("未実装のためスキップ")
    @Test
    void skippedTest() {
        // 実行されない
    }
}

3. パラメータ付きテスト

✅ JUnit4

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.*;

@RunWith(Parameterized.class)
public class ParameterTest {

    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            {1, 2, 3},
            {2, 3, 5}
        });
    }

    private final int a;
    private final int b;
    private final int expected;

    public ParameterTest(int a, int b, int expected) {
        this.a = a;
        this.b = b;
        this.expected = expected;
    }

    @Test
    public void testSum() {
        org.junit.Assert.assertEquals(expected, a + b);
    }
}

✅ JUnit5

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

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

class ParameterTest {

    @ParameterizedTest
    @CsvSource({
        "1, 2, 3",
        "2, 3, 5"
    })
    void testSum(int a, int b, int expected) {
        assertEquals(expected, a + b);
    }
}

4. 複数アサーション

✅ JUnit4

import org.junit.Test;
import static org.junit.Assert.*;

public class AssertTest {

    @Test
    public void testValues() {
        assertEquals(100, getPrice());
        assertTrue(isAvailable());
    }

    private int getPrice() { return 100; }
    private boolean isAvailable() { return true; }
}

✅ JUnit5

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class AssertTest {

    @Test
    void testValues() {
        assertAll(
            () -> assertEquals(100, getPrice()),
            () -> assertTrue(isAvailable())
        );
    }

    private int getPrice() { return 100; }
    private boolean isAvailable() { return true; }
}

5. 拡張機能の違い(Mockitoの例)

✅ JUnit4

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class MockitoExampleTest {

    @Mock
    private List<String> mockList;

    @Test
    public void testMock() {
        when(mockList.size()).thenReturn(5);
        org.junit.Assert.assertEquals(5, mockList.size());
    }
}

✅ JUnit5

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.List;

@ExtendWith(MockitoExtension.class)
class MockitoExampleTest {

    @Mock
    List<String> mockList;

    @Test
    void testMock() {
        when(mockList.size()).thenReturn(5);
        assertEquals(5, mockList.size());
    }
}

🔧 環境設定(JUnit5)

Mavenの依存関係

<dependencies>
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.10.0</version>
    <scope>test</scope>
  </dependency>
</dependencies>

Gradleの依存関係

testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'

test {
    useJUnitPlatform()
}

🧪 実装サンプル(JUnit4とJUnit5)

✅ JUnit4の例

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class CalculatorTest {

    private Calculator calc;

    @Before
    public void setUp() {
        calc = new Calculator();
    }

    @Test
    public void testAdd() {
        assertEquals(4, calc.add(2, 2));
    }
}

✅ JUnit5の例

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculatorTest {

    private Calculator calc;

    @BeforeEach
    void init() {
        calc = new Calculator();
    }

    @Test
    void testAdd() {
        assertEquals(4, calc.add(2, 2));
    }
}

📤 入出力のイメージ

  • 入力コード(上記)
  • 実行出力例(IDEのテスト結果):
CalculatorTest > testAdd() ✔ PASSED

🧠 たとえ話で理解する:JUnit4とJUnit5の違い

JUnit4は「一軒家」で必要な機能がすべて一体化。
JUnit5は「分譲マンション」で、Platform(共通部分)・Jupiter(新築棟)・Vintage(旧棟)に分かれ、拡張も楽にできる構造。


🔄 Mermaid.jsで理解する構成図(JUnit5)

graph TD
  A[JUnit Platform]
  B[Jupiter Engine(JUnit5)]
  C[Vintage Engine(JUnit4互換)]

  A --> B
  A --> C
Loading

✅ よく使うアノテーション対応表

機能 JUnit4 JUnit5
テスト定義 @Test @Test
初期処理 @Before @BeforeEach
後処理 @After @AfterEach
クラス前処理 @BeforeClass @BeforeAll
クラス後処理 @AfterClass @AfterAll
無効化 @Ignore @Disabled

🧩 おすすめの使い分け

ケース 推奨フレームワーク
既存プロジェクトがJUnit4 JUnit4(VintageでJUnit5移行も可)
新規開発プロジェクト JUnit5
拡張性・パラメータテスト・カスタマイズ重視 JUnit5

🔚 まとめ

  • JUnit5は柔軟性・拡張性が高く、新規開発におすすめ
  • JUnit4のコードもVintage EngineでJUnit5から実行可能。
  • パラメータテストや複数アサーションを使う場合はJUnit5が便利。
⚠️ **GitHub.com Fallback** ⚠️