junior
Какие основные аннотации JUnit 5 вы знаете?
JUnit 5 предоставляет аннотации для управления жизненным циклом тестов, параметризации, группировки и фильтрации. Ядро: @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll, @DisplayName, @Disabled, @Nested, @ParameterizedTest.
Жизненный цикл теста
Пример
class LifecycleTest {
@BeforeAll // один раз перед всеми тестами (static)
static void initAll() { }
@BeforeEach // перед каждым тестом
void init() { }
@Test
void testMethod() { }
@AfterEach // после каждого теста
void tearDown() { }
@AfterAll // один раз после всех тестов (static)
static void tearDownAll() { }
}
Основные аннотации
| Аннотация | Назначение |
|---|---|
@Test |
Маркирует тестовый метод |
@DisplayName |
Человекочитаемое имя теста |
@Disabled |
Пропустить тест (аналог @Ignore в JUnit 4) |
@Tag |
Тегирование для фильтрации (unit, integration) |
@Timeout |
Таймаут в секундах |
@Nested |
Вложенные тесты для группировки сценариев |
@RepeatedTest |
Повторение теста N раз |
@ParameterizedTest |
Параметризованный тест с несколькими наборами данных |
Вложенные тесты
Пример
@Nested
@DisplayName("Когда пользователь авторизован")
class WhenAuthenticated {
@Test void shouldAccessProfile() { }
@Test void shouldAccessSettings() { }
}
Параметризованные тесты
Примеры параметризованных тестов
@ParameterizedTest
@ValueSource(strings = {"racecar", "radar", "level"})
void shouldDetectPalindrome(String word) {
assertTrue(StringUtils.isPalindrome(word));
}
@ParameterizedTest
@CsvSource({"1, 1, 2", "2, 3, 5", "10, 20, 30"})
void shouldAdd(int a, int b, int expected) {
assertEquals(expected, calculator.add(a, b));
}
@ParameterizedTest
@MethodSource("orderProvider")
void shouldCalculateTotal(Order order, BigDecimal expected) {
assertEquals(expected, order.getTotal());
}
static Stream<Arguments> orderProvider() {
return Stream.of(
Arguments.of(new Order(2, 10.0), BigDecimal.valueOf(20.0)),
Arguments.of(new Order(0, 10.0), BigDecimal.ZERO)
);
}
Assertions (проверки)
Пример
assertEquals(expected, actual);
assertNotNull(object);
assertTrue(condition);
assertThrows(Exception.class, () -> riskyMethod());
assertDoesNotThrow(() -> safeMethod());
assertTimeout(Duration.ofSeconds(2), () -> longMethod());
// Группировка -- все assertions выполняются, даже если первый упал
assertAll(
() -> assertEquals("John", user.getName()),
() -> assertEquals("john@mail.com", user.getEmail()),
() -> assertNotNull(user.getId())
);
Миграция с JUnit 4 на JUnit 5
| JUnit 4 | JUnit 5 |
|---|---|
@Before |
@BeforeEach |
@After |
@AfterEach |
@BeforeClass |
@BeforeAll |
@AfterClass |
@AfterAll |
@Ignore |
@Disabled |
@Test(expected=...) |
assertThrows(...) |
@RunWith |
@ExtendWith |
Ключевые принципы
- JUnit 5 = JUnit Platform + JUnit Jupiter (новый API) + JUnit Vintage (совместимость с JUnit 4)
@BeforeAll/@AfterAll–staticпо умолчанию; для нестатических:@TestInstance(Lifecycle.PER_CLASS)@ParameterizedTest– один тест с множеством входных данных; заменяет дублированиеassertAll– проверяет все условия, показывая все ошибки сразу
Частые ошибки
- JUnit 4 аннотации в JUnit 5 –
@Beforeвместо@BeforeEach,@Ignoreвместо@Disabled @ParameterizedTestбез источника данных – нужен@ValueSource,@CsvSourceили@MethodSource- Забыть
@Test– метод без аннотации не запустится как тест
Как используется в 2026
- JUnit 5 – единственная актуальная версия; JUnit 4 – legacy
@Tag+ Maven/Gradle profiles – раздельный запуск unit и integration тестов- IntelliJ IDEA полностью поддерживает
@DisplayName,@Nested,@ParameterizedTest
На собеседовании: интервьюер часто просит перечислить аннотации жизненного цикла и объяснить разницу с JUnit 4. Частая ошибка – не знать про
@ParameterizedTestи@Nested, которые показывают уровень владения фреймворком.