@SpringBootTest

Тема дорожной карты · Spring Boot

@SpringBootTest — основная аннотация тестирования Spring Boot для написания полностековых интеграционных тестов, загружающих полный ApplicationContext по тем же правилам авто-конфигурации и сканирования компонентов, что используются в продакшене. По умолчанию она загружает все классы @Configuration, обнаруженные через @SpringBootApplication, но атрибут classes сужает контекст до конкретных конфигураций, а webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT запускает реальный встроенный Tomcat или Netty на свободном порту для HTTP-уровневых утверждений. @SpringBootTest работает совместно с @Autowired для внедрения любого Spring-бина — @Service, @Repository, SecurityFilterChain, MockMvc или WebTestClient — и с Testcontainers для запуска реальных Docker-контейнеров PostgreSQL, MongoDB, Redis или Kafka, заменяющих in-memory-заглушки в модульных тестах. Аннотация поддерживает переопределение значений application.properties через атрибут properties или @TestPropertySource, упрощая активацию конкретного Spring Profile, отключение запланированных задач через spring.task.scheduling.enabled=false или переключение теста на встроенную базу H2. @SpringBootTest является краеугольным камнем пирамиды тестирования Spring Boot: используется экономно для высокоценных интеграционных сценариев, тогда как @WebMvcTest, @DataJpaTest и @DataMongoTest предоставляют более быстрые, ограниченные по срезу альтернативы для отдельных слоёв.

Как это работает

@SpringBootTest: @SpringBootTest бутит полный контекст для интеграционных тестов (медленно, но реалистично). @WebMvcTest + MockMvc для controller-layer unit-тестов (без DB, без полного контекста — быстро). @DataJpaTest для repository-тестов на H2/Testcontainers DB. Testcontainers (Java интеграция) поднимают реальные DB/queues/сервисы в Docker per test — самый high-fidelity вариант. REST Assured для fluent end-to-end API-тестов. Spring Boot test slices держат тесты быстрыми, бутая только нужный слой.

Когда применять

Дефолт Testcontainers вместо H2 — та же DB в тестах + prod = без сюрпризов dialect. Slice-тесты (@WebMvcTest, @DataJpaTest) для быстрой обратной связи; @SpringBootTest для настоящих интеграционных тестов. Mock external HTTP-сервисы через WireMock. Целитесь в testing pyramid — много unit, меньше slice, ещё меньше full integration.

Типичные ошибки

Ловушки @SpringBootTest: только @SpringBootTest везде (медленно + flaky); H2 для теста против Postgres prod (H2 + Postgres SQL отличаются); flaky-тесты из-за random ports без proper cleanup; мокают всё (тестируете моки, не код).

Связанные понятия

Полезные ресурсы