← Назад к вопросам

В чем разница между JUnit 5 и JUnit 4?

2.2 Middle🔥 231 комментариев
#Основы Java#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Разница между JUnit 5 и JUnit 4

Краткий ответ

JUnit 5 — это полная переделка платформы тестирования Java. JUnit 4 — предшественник. JUnit 5 имеет современную архитектуру, лучше параметризацию и больше возможностей.

1. Архитектура

JUnit 4

Монолитная структура — одна библиотека со всеми возможностями.

JUnit 5 (Jupiter)

Модульная архитектура — три компонента:

  • JUnit Platform - базовая платформа для запуска тестов
  • JUnit Jupiter - новое ядро с аннотациями
  • JUnit Vintage - поддержка JUnit 3 и JUnit 4

2. Аннотации

JUnit 4

public class CalculatorTest {
    @BeforeClass  // статический, один раз
    public static void setUpClass() { }
    
    @Before       // перед каждым
    public void setUp() { }
    
    @Test
    public void testAdd() { }
    
    @After        // после каждого
    public void tearDown() { }
    
    @AfterClass   // статический, один раз
    public static void tearDownClass() { }
    
    @Ignore       // пропустить
    @Test
    public void ignoredTest() { }
}

JUnit 5

public class CalculatorTest {
    @BeforeAll    // статический, один раз
    static void setUpAll() { }
    
    @BeforeEach   // перед каждым
    void setUp() { }
    
    @Test
    void testAdd() { }
    
    @AfterEach    // после каждого
    void tearDown() { }
    
    @AfterAll     // статический, один раз
    static void tearDownAll() { }
    
    @Disabled     // пропустить
    @Test
    void disabledTest() { }
    
    @DisplayName("Проверка сложения")  // красивое имя
    @Test
    void addition() { }
}

3. Параметризованные тесты

JUnit 4 - сложный синтаксис

@RunWith(Parameterized.class)
public class ParameterizedTest {
    private int input;
    private int expected;
    
    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
            { 2, 4 }, { 3, 9 }, { 4, 16 }
        });
    }
    
    @Test
    public void testSquare() {
        assertEquals(expected, input * input);
    }
}

JUnit 5 - простой и понятный

class ParameterizedTest {
    @ParameterizedTest
    @ValueSource(ints = { 1, 2, 3, 4 })
    void testWithValueSource(int value) {
        assertTrue(value > 0);
    }
    
    @ParameterizedTest
    @CsvSource({ "1,1", "2,4", "3,9" })
    void testWithCsv(int input, int expected) {
        assertEquals(expected, input * input);
    }
    
    @ParameterizedTest
    @MethodSource("provideNumbers")
    void testWithMethodSource(int value) {
        assertTrue(value > 0);
    }
    
    private static Stream<Integer> provideNumbers() {
        return Stream.of(1, 2, 3, 4);
    }
}

4. Dynamic Tests (новое в JUnit 5)

Создание тестов во время выполнения:

class DynamicTest {
    @TestFactory
    Collection<org.junit.jupiter.api.DynamicTest> dynamicTests() {
        return Arrays.asList(
            dynamicTest("test 1", () -> assertTrue(true)),
            dynamicTest("test 2", () -> assertEquals(4, 2 + 2))
        );
    }
}

5. Вложенные тесты (новое в JUnit 5)

class CalculatorTest {
    @Nested
    @DisplayName("Addition Tests")
    class AdditionTests {
        @Test
        void test() {
            assertEquals(4, 2 + 2);
        }
    }
    
    @Nested
    @DisplayName("Multiplication Tests")
    class MultiplicationTests {
        @Test
        void test() {
            assertEquals(12, 3 * 4);
        }
    }
}

6. Extensions vs Rules

JUnit 4 - Rules

public class TestWithRules {
    @Rule
    public ExpectedException thrown = ExpectedException.none();
    
    @Test
    public void testException() {
        thrown.expect(IllegalArgumentException.class);
        throw new IllegalArgumentException();
    }
}

JUnit 5 - Extensions

@ExtendWith(CustomExtension.class)
class TestWithExtensions {
    @Test
    void testWithExtension() {
        assertEquals(1, 1);
    }
}

public class CustomExtension implements BeforeEachCallback {
    @Override
    public void beforeEach(ExtensionContext context) {
        System.out.println("Before each");
    }
}

7. Условное выполнение (новое в JUnit 5)

class ConditionalTests {
    @EnabledOnOs(OS.WINDOWS)
    @Test
    void onlyOnWindows() { }
    
    @DisabledOnOs(OS.LINUX)
    @Test
    void disabledOnLinux() { }
    
    @EnabledIfEnvironmentVariable(named = "ENV", matches = ".*dev.*")
    @Test
    void onlyOnDev() { }
}

8. Таблица сравнения

ФункцияJUnit 4JUnit 5
АрхитектураМонолитнаяМодульная
ПараметризацияСложнаяПростая (@ParameterizedTest)
Dynamic TestsНетДа (@TestFactory)
Nested TestsНетДа (@Nested)
Display NamesНетДа (@DisplayName)
Conditional ExecutionНетДа
LambdaЧастичнаяПолная
ExtensionsRulesДа (мощнее)
Другие фреймворкиНетДа (Platform)

9. Миграция с JUnit 4 на JUnit 5

<!-- Добавить зависимость -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>

Основные изменения:

  1. @Before → @BeforeEach
  2. @After → @AfterEach
  3. @BeforeClass → @BeforeAll
  4. @AfterClass → @AfterAll
  5. @Ignore → @Disabled
  6. Убрать @RunWith

Заключение

JUnit 5 — современный фреймворк с лучшей архитектурой, более простой параметризацией, динамическими тестами и условным выполнением. Для новых проектов рекомендуется JUnit 5. Миграция с JUnit 4 обычно проста.

В чем разница между JUnit 5 и JUnit 4? | PrepBro