Что такое Extension в JUnit 5?

«Что такое Extension в JUnit 5?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Extension (Расширение) в JUnit 5 — это замена устаревшим @Rule из JUnit 4. Это механизм для внедрения пользовательского поведения на различных этапах жизненного цикла теста.

Как работает: Вы реализуете один или несколько интерфейсов обратного вызова (callback) и регистрируете расширение с помощью @ExtendWith.

Основные интерфейсы для реализации:

  • BeforeAllCallback, AfterAllCallback — до/после всех тестов в классе.
  • BeforeEachCallback, AfterEachCallback — до/после каждого тестового метода.
  • TestExecutionCondition — для условного выполнения тестов (аналог @DisabledIf).
  • ParameterResolver — для внедрения параметров в тестовый метод.

Пример: расширение для логирования времени выполнения теста.

import org.junit.jupiter.api.extension.*;

public class TimingExtension implements BeforeEachCallback, AfterEachCallback {
    private long startTime;

    @Override
    public void beforeEach(ExtensionContext context) {
        startTime = System.currentTimeMillis();
    }

    @Override
    public void afterEach(ExtensionContext context) {
        long duration = System.currentTimeMillis() - startTime;
        System.out.printf("Тест [%s] выполнен за %d мс%n", 
                          context.getDisplayName(), duration);
    }
}

// Использование
@ExtendWith(TimingExtension.class)
class MyServiceTest {
    @Test
    void longRunningTest() throws InterruptedException {
        Thread.sleep(100);
        assertTrue(true);
    }
}

Преимущества: Расширения — это мощный, модульный и переиспользуемый способ настройки среды тестирования (например, поднятие БД, инъекция моков, настройка безопасности).