Ответ
Аннотация @ExtendWith в JUnit 5 регистрирует расширения (Extensions), которые добавляют дополнительное поведение к тестовому классу или методу.
Что указывают: Классы, реализующие интерфейс Extension. Например:
@ExtendWith(MockitoExtension.class) // Подключает поддержку Mockito
class UserServiceTest {
@Mock
private UserRepository repository;
// ... тесты с моками
}
Распространённые расширения:
MockitoExtension.class— для интеграции Mockito (автоматическое создание моков через@Mock).SpringExtension.class— для загрузки SpringApplicationContextв тестах (заменяет@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}) // И моки, и логи — всё в одном флаконе!
В чём, блядь, соль-то? А соль в том, чтобы не превращать тест в помойку из подготовительного кода. Вся эта вспомогательная ебалда — настройка моков, поднятие контекста, создание временных файлов — выносится в отдельные, переиспользуемые модули. Тест остаётся чистым, как слеза младенца, и занимается только своей работой — проверкой логики. Удобно, ёпта!