Статья подготовлена для студентов курса «Разработчик на Spring Framework» в образовательном проекте OTUS.
В прошлой части мы рассмотрели тестирование слоя контроллера, в этой части давайте рассмотрим поближе тестирование бизнес-слоя и слоя JPA-репозиториев.
К примеру у нас есть следующий код:
В данном примере у нас имеется SpringBoot-приложение с JPA-репозиторием и бизнес-сервисом, который работает, в частности, с репозиторием.
Чтобы протестировать сервис (бизнес-слой) в принципе не нужен SpringBoot — всегда можно создать моки (в данном случае PersonRepository), и если класс написан в соответствии с IoC, то нам вполне этого достаточно.
А можем всё-таки использовать аннотацию @SpringBootTest. Зачем, станет понятно чуть позже.
Итак, тест выглядит следующим образом:
Разберёмся немного, как работает аннотация SpringBootTest:
1. Тест c @SpringBootTest находится в пакете ru.otus.example.service. Движок идёт по пакету вверх, пока не встретит класс, помеченный аннотацией @SpringBootConfiguration (как ни странно, это наш Main, потому что аннотация @SpringBootApplication помечена искомой).
2. Далее происходит поиск бинов, сервисов и других конфигураций согласно @ComponentScan (да, эта аннотация тоже включена в @SpringBootApplication), спускаясь от этого класса.
3. Но не все бины будут созданы для теста. Тест содержит поле PersonRepository, помеченное @MockBean. Поэтому вместо реального репозитория, в PersonService придёт мок.
4. Ну и после поднятия контекста в @Autowired придёт созданный сервис.
Подобная аннотация SpringBootTest позволяет также писать интеграционные тесты. В данном примере будет использоваться уже реальный JPA-репозиторий.
Такие тесты используют настроенную в application.yml базу данных. В принципе, JPA-репозитории можно тестировать на embedded DB без особых проблем. Конечно, использование нативных SQL-скриптов и хранимых процедур сказывается на возможности и смысле такого тестирования. Но если вы используете только чистый JPA и, например, liquibase в формате YAML, то корректность маппингов проверить можно, и даже нужно — это позволит избежать ошибок на реальной БД.
И выглядит тест на JPA вот таким образом:
На этом всё. Оставим читателю возможность самому изучить, всё-таки, на какой БД это будет выполнено!
Есть вопрос? Пишите комментарий!
Материал подготовлен для студентов курса «Разработчик на Spring Framework» в образовательном проекте OTUS. Чтобы присоединиться к ближайшей группе, обязательно пройдите вступительное тестирование:
ПРОЙТИ ТЕСТИРОВАНИЕ