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

Ответ

Аннотация @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) от самого теста, делая код чище и переиспользуемым.

Ответ 18+ 🔞

О, смотри-ка, народ, про эту вашу аннотацию @ExtendWith! Это ж, блядь, как волшебная палочка для тестов на JUnit 5, ей-богу. Вместо того чтобы в каждом тесте городить огород с ручной настройкой всякой хуйни, ты просто говоришь: «Эй, Юнит, подцепи-ка мне вот этот полезный модуль».

Что в неё пихают? А пихают туда, сука, классы, которые умеют делать что-то полезное до, после или даже вместо твоего теста. Типа таких надсмотрщиков.

Вот смотри, классика жанра — Mockito. Без расширения ты бы там сам создавал моки, инициировал поля... Пиздец рутина. А с ним — красота:

@ExtendWith(MockitoExtension.class) // Сказал волшебные слова, и понеслась!
class UserServiceTest {
    @Mock
    private UserRepository repository; // Этот репозиторий теперь сам собой стал муляжом!
    // ... и тестируй себе на здоровье, не парись.
}

Какие бывают эти расширения-надзиратели?

  • MockitoExtension.class — это твой лучший друг, когда надо набыдлокодить кучу моков. Сам всё создаст, проинициализирует, руки только развязывает.
  • SpringExtension.class — о, это для мазохистов, которые любят Spring. Вместо старого @RunWith(SpringRunner.class) из четвёртого Юнита, теперь это. Поднимает целый контекст Spring, будто в настоящем приложении. Ёперный театр, иногда медленно, но что поделать.
  • TempDirectory.class — вот это полезная штука, ей-богу. Дал тебе временную папку для файлов, а после теста сам всё подчистит, не оставив и следа. Красота!

А можно несколько? Да хули нельзя-то, можно! Вешай, сколько влезет, главное — в фигурных скобках перечисли.

@ExtendWith({MockitoExtension.class, LoggingExtension.class}) // И моки, и логи — всё в одном флаконе!

В чём, блядь, соль-то? А соль в том, чтобы не превращать тест в помойку из подготовительного кода. Вся эта вспомогательная ебалда — настройка моков, поднятие контекста, создание временных файлов — выносится в отдельные, переиспользуемые модули. Тест остаётся чистым, как слеза младенца, и занимается только своей работой — проверкой логики. Удобно, ёпта!