Для чего используется аннотация @ExtendWith в JUnit 5 и что в неё указывают?

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

Ответ

Аннотация @ExtendWith в JUnit 5 регистрирует расширения (Extensions), которые добавляют дополнительное поведение к тестовому классу или методу.

Что указывают: Классы, реализующие интерфейс Extension. Например:

@ExtendWith(MockitoExtension.class) // Подключает поддержку Mockito
class UserServiceTest {
    @Mock
    private UserRepository repository;
    // ... тесты с моками
}

Распространённые расширения:

  • MockitoExtension.class — для интеграции Mockito (автоматическое создание моков через @Mock).
  • SpringExtension.class — для загрузки Spring ApplicationContext в тестах (заменяет @RunWith(SpringRunner.class) из JUnit 4).
  • TempDirectory.class — предоставляет временную директорию для тестовых файлов.

Можно указать несколько расширений:

@ExtendWith({MockitoExtension.class, LoggingExtension.class})

Почему это важно: Расширения позволяют отделить вспомогательную логику (настройка моков, контекста Spring) от самого теста, делая код чище и переиспользуемым.