@DataJpaTest

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

@DataJpaTest — это аннотация тестового среза Spring Boot, которая загружает только JPA-слой Spring Boot-приложения: Hibernate, DataSource, репозитории Spring Data JPA и базу данных H2 в памяти — без загрузки @Service, @RestController и других бинов, не связанных с персистентностью. Тесты, аннотированные @DataJpaTest, по умолчанию выполняются внутри транзакции, откатываемой после каждого тестового метода, что обеспечивает изоляцию базы данных без ручной очистки, а помощник TestEntityManager внедряется наряду с любым тестируемым @Repository. Для тестирования с реальным движком базы данных вместо H2 разработчики аннотируют тест @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) и предоставляют управляемый Testcontainers контейнер PostgreSQL или MySQL. @DataJpaTest — рекомендуемый Spring Boot подход для валидации методов с @Query, маппинга сущностей, поведения каскадов Hibernate и стратегий загрузки JPA в изоляции. Сочетание @DataJpaTest с Testcontainers обеспечивает наивысшую достоверность до полного интеграционного теста, выявляя проблемы SQL-диалекта на ранних этапах.

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

@DataJpaTest: @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.

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

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

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

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