Управляйте H2 и Postgres в одном pom.xml в Spring Boot - PullRequest
3 голосов
/ 04 июня 2019

Я занимаюсь разработкой микро-сервисного приложения с использованием Spring Boot. Мое приложение будет использовать для производственной конфигурации базу данных Postgres, а для автоматического тестирования Spring Boot - базу данных H2. Мой pom.xml включает в себя обе зависимости (H2 + Postgres). Я попытался связать зависимость H2 с областью действия tes, а Postgres со средой выполнения следующим образом:

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>test</scope>
        </dependency>

При запуске mvn test я вижу, что Spring Boot по умолчанию выбирает базу данных postgres, которой нет в моей модульной тестовой среде. Вот почему я предпочитаю использовать H2 для запуска модульных тестов.

Есть ли правильный способ сказать Spring Boot использовать H2 для тестирования и Postgres в противном случае?

Я не знаю, решит ли проблему использование другого файла application.properties (один в src / main / resources, а другой в src / test / resources).

1 Ответ

3 голосов
/ 04 июня 2019

Вы должны знать, что существует несколько путей к классам, например:

  1. Путь к классу времени компиляции,
  2. Путь к классу времени выполнения,
  3. Тестированиеclasspath.

Когда вы используете <scope>runtime</scope>, зависимость будет доступна как в classpath времени выполнения в качестве , проверяя classpath , как указано документация :

Эта область указывает, что зависимость не требуется для компиляции, но предназначена для выполнения.Он находится во время выполнения и пути к классам тестов, но не в пути к классам компиляции.

Это означает, что даже когда вы выполняете свои тесты, Postgres все равно будет на вашем пути к классам, если вы используете <scope>runtime</scope>.


Упомянутое вами решение, предоставив два отдельных application.properties, является правильным выбором.

В пределах src/main/resources/application.properties вы можете настроить источник данных следующим образом:

spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase

В src/test/resources/application.properties вы можете настроить источник данных следующим образом:

spring.datasource.url=jdbc:h2:mydatabase

Если вам нужно более детальное управление, вы можете использовать профили Spring.Например, вы можете использовать профиль с именем «testdb», а затем аннотировать ваш тест с помощью @ActiveProfiles("testdb").

Теперь вы можете создать файл с именем application-testdb.properties и добавить свойства, необходимые для настройки теста.базы данных.

...