Gymterview
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/@AfterAllstatic по умолчанию; для нестатических: @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, которые показывают уровень владения фреймворком.