Рубрики
Без рубрики

Настройка отдельного источника данных Spring для тестов

Краткое практическое руководство по настройке отдельного источника данных для тестирования в приложении Spring.

Автор оригинала: baeldung.

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 .