Какой контейнер Spring поднимается при выполнении интеграционных тестов с @SpringBootTest?

Ответ

При запуске интеграционных тестов с аннотацией @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-компонентов, чтобы базу не грузить по-взрослому. Вообще красота, ядрёна вошь!