Тестирование Spring

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

Тестирование в Spring Boot поддерживается богатым набором аннотаций и тестовых срезов, позволяющих писать быстрые, сфокусированные модульные тесты, изолированные тесты слоёв и полностековые интеграционные тесты в рамках одной структуры проекта. Зависимость spring-boot-starter-test поставляет JUnit 5, Mockito, AssertJ, Hamcrest и MockMvc / WebTestClient, так что большинство потребностей в тестировании покрываются без дополнительных зависимостей; @SpringBootTest загружает полный контекст приложения для сквозной интеграционной проверки, тогда как @WebMvcTest, @DataJpaTest, @DataMongoTest и @DataRedisTest загружают только соответствующий Spring Boot-срез для ускорения обратной связи. Тестовые срезы Spring Boot авто-конфигурируют соответствующие репозитории Spring Data, Hibernate или инфраструктуру Spring MVC, заменяя остальное заглушками @MockBean, — это позволяет тестировать слои контроллера и репозитория в полной изоляции без работающей базы данных или брокера. Тестирование в Spring Boot интегрируется с Testcontainers для реалистичных интеграционных тестов против Docker-экземпляров PostgreSQL, MongoDB, Redis, Kafka или RabbitMQ и с @WithMockUser и @WithSecurityContext из Spring Security Test для проверки правил авторизации в сценариях @WebMvcTest. Хорошо структурированная стратегия тестирования в Spring Boot сочетает @SpringBootTest для критических пользовательских сценариев, тесты срезов для отдельных компонентов и модульные тесты с Mockito для логики @Service и бизнес-логики — обеспечивая максимальную уверенность при минимальных затратах CI-пайплайна.

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

Тестирование Spring: @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.

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

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

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

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