1. Обзор
При тестировании приложения Spring, которое опирается на уровень персистентности, такой как JPA, мы можем настроить источник тестовых данных для использования меньшей и более быстрой базы данных, отличной от той, которую мы используем для запуска приложения, чтобы значительно упростить выполнение наших тестов.
Настройка источника данных в Spring требует определения компонента типа DataSource либо вручную , либо, при использовании Spring Boot, через стандартные свойства приложения.
В этом кратком руководстве мы рассмотрим несколько способов настройки отдельного источника данных для тестирования весной .
2. Зависимости Maven
Мы собираемся создать приложение Spring Boot с использованием Spring JPA и тестирования, поэтому нам понадобятся следующие зависимости:
org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 org.springframework.boot spring-boot-starter-test
Последние версии spring-boot-starter-data-jpa , h2 и spring-boot-starter-test можно загрузить с Maven Central.
Давайте рассмотрим несколько различных способов настройки источника данных для тестирования.
3. Использование стандартного файла свойств в Spring Boot
Стандартный файл свойств, который автоматически загружается при запуске приложения, называется application.properties и находится в папке src/main/resources .
Если мы хотим использовать разные свойства для тестов, мы можем переопределить файл свойств в папке main , поместив другой файл с тем же именем в src/test/resources .
Файл application.properties в папке src/test/resources должен содержать стандартные пары ключ-значение, необходимые для настройки источника данных. Эти свойства имеют префикс spring.datasource .
Например, давайте настроим базу данных H2 в памяти в качестве источника данных для тестов:
spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password=sa
Spring Boot будет использовать эти свойства для автоматической настройки источника данных компонента.
Давайте определим очень простую универсальную сущность и репозиторий с помощью Spring JPA:
@Entity public class GenericEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String value; //standard constructors, getters, setters }
public interface GenericEntityRepository extends JpaRepository{ }
Далее, давайте напишем тест JUnit для репозитория. Для того, чтобы тест в приложении Spring Boot получил стандартные свойства источника данных, которые мы определили, он должен быть аннотирован с помощью @SpringBootTest :
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringBootJPAIntegrationTest { @Autowired private GenericEntityRepository genericEntityRepository; @Test public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() { GenericEntity genericEntity = genericEntityRepository .save(new GenericEntity("test")); GenericEntity foundEntity = genericEntityRepository .findOne(genericEntity.getId()); assertNotNull(foundEntity); assertEquals(genericEntity.getValue(), foundEntity.getValue()); } }
4. Использование файла пользовательских свойств
Если мы не хотим использовать стандартный файл application.properties и ключи, или если мы не используем Spring Boot, мы можем определить пользовательский файл .properties с пользовательскими ключами, а затем прочитать этот файл в классе @Configuration , чтобы создать источник данных bean на основе содержащихся в нем значений.
Этот файл будет помещен в папку src/main/resources для нормального режима работы приложения и в папку src/test/resources для того, чтобы быть выбранным тестами.
Давайте создадим файл с именем persistence-generic-entity.properties , который использует базу данных H2 в памяти для тестов, и поместим его в папку src/test/resources :
jdbc.driverClassName=org.h2.Driver jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 jdbc.username=sa jdbc.password=sa
Затем мы можем определить источник данных компонент на основе этих свойств в классе @Configuration , который загружает наш persistence-generic-entity.properties в качестве источника свойств:
@Configuration @EnableJpaRepositories(basePackages = "org.baeldung.repository") @PropertySource("persistence-generic-entity.properties") @EnableTransactionManagement public class H2JpaConfig { // ... }
Для получения более подробного примера этой конфигурации, пожалуйста , ознакомьтесь с нашей предыдущей статьей об автономном тестировании с базой данных в памяти, раздел “Конфигурация JPA”.
Затем мы можем создать тест JUnit , аналогичный предыдущему, за исключением того, что он загрузит наш класс конфигурации:
@RunWith(SpringRunner.class) @SpringBootTest(classes = {Application.class, H2JpaConfig.class}) public class SpringBootH2IntegrationTest { // ... }
5. Использование Пружинных Профилей
Другой способ настроить отдельный источник данных для тестирования-использовать профили Spring для определения компонента Источник данных , который доступен только в профиле test .
Для этого мы можем использовать файл .properties , как и раньше, или мы можем записать значения в самом классе.
Давайте определим Источник данных компонент для профиля test в классе @Configuration , который будет загружен нашим тестом:
@Configuration @EnableJpaRepositories(basePackages = { "org.baeldung.repository", "org.baeldung.boot.repository" }) @EnableTransactionManagement public class H2TestProfileJPAConfig { @Bean @Profile("test") public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1"); dataSource.setUsername("sa"); dataSource.setPassword("sa"); return dataSource; } // configure entityManagerFactory // configure transactionManager // configure additional Hibernate properties }
Затем в классе JUnit test нам нужно указать, что мы хотим использовать профиль test , добавив аннотацию @ActiveProfiles :
@RunWith(SpringRunner.class) @SpringBootTest(classes = { Application.class, H2TestProfileJPAConfig.class}) @ActiveProfiles("test") public class SpringBootProfileIntegrationTest { // ... }
6. Заключение
В этом кратком руководстве мы рассмотрели несколько способов, с помощью которых мы можем настроить отдельный источник данных для тестирования весной.
Как всегда, полный исходный код примеров можно найти на GitHub .