【テスト】JUnit4とJUnit5の違いと使い方
JUnit(読み方:ジェイユニット)は、Javaアプリケーションの単体テストフレームワークです。
JUnit4と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() でまとめて記述可能 |
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("テスト本体");
}
}
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("テスト本体");
}
}
import org.junit.Ignore;
import org.junit.Test;
public class IgnoreExample {
@Ignore("未実装のためスキップ")
@Test
public void skippedTest() {
// 実行されない
}
}
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class DisabledExample {
@Disabled("未実装のためスキップ")
@Test
void skippedTest() {
// 実行されない
}
}
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);
}
}
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);
}
}
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; }
}
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; }
}
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());
}
}
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());
}
}
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
test {
useJUnitPlatform()
}
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));
}
}
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が便利。