Ответ
При запуске интеграционных тестов с аннотацией @SpringBootTest поднимается полный или частичный ApplicationContext Spring, аналогичный контексту работающего приложения.
Что это дает:
- Загружаются все конфигурации (
@Configurationклассы). - Сканируются и создаются бины (
@Component,@Service,@Repositoryи др.). - Настраиваются профили (
@ActiveProfiles) и свойства. - Внедряются зависимости в тестовый класс через
@Autowired.
Пример интеграционного теста:
@SpringBootTest // Запускает контейнер Spring для теста
class UserServiceIntegrationTest {
@Autowired
private UserService userService; // Бин из поднятого контекста
@Test
void testUserCreation() {
User user = userService.createUser("John Doe");
assertNotNull(user);
assertNotNull(user.getId());
}
}
Для модульных тестов (без поднятия всего контекста) используются:
@MockBean/@SpyBeanдля мокирования бинов в легковесном контексте.@WebMvcTestдля тестирования только слоя MVC.@DataJpaTestдля тестирования только JPA-компонентов.
Ответ 18+ 🔞
Да ты посмотри, какая жесть творится с этими тестами! Ну, типа, берёшь ты аннотацию @SpringBootTest, и что она делает? Правильно, поднимает тебе целый ApplicationContext от Spring, как будто приложение реальное запустилось. Весь этот цирк с конями, блядь!
И что в итоге получается, ёпта?
- Все эти твои конфигурации (
@Configuration) грузятся, хочешь ты того или нет. - Бины всякие сканируются и создаются —
@Component,@Service,@Repository, и прочая ерунда. - Профили настраиваются (
@ActiveProfiles), свойства подтягиваются — полный пакет, короче. - И самое главное — зависимости тебе в тестовый класс через
@Autowiredвпендюриваются, как будто так и надо!
Вот смотри, как это выглядит на практике, блядь:
@SpringBootTest // Щас тут весь Spring встанет раком для нашего теста
class UserServiceIntegrationTest {
@Autowired
private UserService userService; // Выдернули бин прямо из контекста, красота!
@Test
void testUserCreation() {
User user = userService.createUser("John Doe");
assertNotNull(user);
assertNotNull(user.getId());
}
}
А если тебе не надо весь этот овердохуищный контекст, если ты юнит-тесты пишешь, то тут другие инструменты, хитрая жопа:
@MockBean/@SpyBean— чтобы замокать какие-то бины в облегчённом контексте, не поднимая всю вселенную.@WebMvcTest— когда тебе только слой MVC пощупать охота, а всё остальное — нахуй не надо.@DataJpaTest— чисто для JPA-компонентов, чтобы базу не грузить по-взрослому. Вообще красота, ядрёна вошь!