← Назад к вопросам
В чем разница между 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 4 | JUnit 5 |
|---|---|---|
| Архитектура | Монолитная | Модульная |
| Параметризация | Сложная | Простая (@ParameterizedTest) |
| Dynamic Tests | Нет | Да (@TestFactory) |
| Nested Tests | Нет | Да (@Nested) |
| Display Names | Нет | Да (@DisplayName) |
| Conditional Execution | Нет | Да |
| Lambda | Частичная | Полная |
| Extensions | Rules | Да (мощнее) |
| Другие фреймворки | Нет | Да (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>
Основные изменения:
- @Before → @BeforeEach
- @After → @AfterEach
- @BeforeClass → @BeforeAll
- @AfterClass → @AfterAll
- @Ignore → @Disabled
- Убрать @RunWith
Заключение
JUnit 5 — современный фреймворк с лучшей архитектурой, более простой параметризацией, динамическими тестами и условным выполнением. Для новых проектов рекомендуется JUnit 5. Миграция с JUnit 4 обычно проста.