Можно ли указать любой класс в аннотации @ExtendWith в JUnit 5?

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

Ответ

Нет, нельзя. В @ExtendWith можно указать только класс, реализующий интерфейс Extension (например, BeforeEachCallback, AfterTestExecutionCallback).

Пример корректного использования:

import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;

class MyCustomExtension implements BeforeEachCallback {
    @Override
    public void beforeEach(ExtensionContext context) {
        System.out.println("Before each test");
    }
}

@ExtendWith(MyCustomExtension.class) // Корректно: MyCustomExtension реализует Extension
class MyTestClass {
    // тесты...
}

Что произойдет, если указать неподходящий класс? При запуске тестов будет выброшено исключение ParameterResolutionException, так как JUnit 5 не сможет создать экземпляр расширения.

Назначение расширений: Они позволяют перехватывать события жизненного цикла теста (перед/после выполнения), модифицировать параметры тестовых методов или изменять поведение тестового контейнера.