Ответ
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);
}
}
Преимущества: Расширения — это мощный, модульный и переиспользуемый способ настройки среды тестирования (например, поднятие БД, инъекция моков, настройка безопасности).