Как перезаписать порты, определенные в application.properties в интеграционных тестах после запуска testcontainer? - PullRequest
0 голосов
/ 03 мая 2019

Предположим, я хочу интегрировать тестовый код, опирающийся на источник данных JPA, в приложении Spring Boot 2.x с PostgreSQL testcontainer (отличный инструмент для управления контейнерами Docker из тестовых классов с одной или несколькими строками кода).Предположим далее, что я управляю портами (включенными в URL JDBC) в application.properties, например,

spring.datasource.url=jdbc:postgresql://user-service-postgres:5432/user_service

. В интеграционном тесте я создаю тест-контейнеры с

@Rule
PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer();

.Метод подготовки. Я могу получить доступ к значению, которое я хочу установить для spring.datasource.url с помощью

postgreSQLContainer.getJdbcUrl()

Как указать Spring Boot в тесте использовать этот URL-адрес вместо того, который указан в application.properties.

Я хотел бы придерживаться своих файлов свойств, чтобы минимизировать изменения, но я благодарен за другие подходы, включая объяснение, почему они также превосходят или необходимы.

Я используюSpring Boot 2.x.

1 Ответ

1 голос
/ 03 мая 2019

Вы можете вручную переопределить свойство из теста Spring-boot, используя ContextConfiguration и ApplicationContextInitializer.

Переопределить свойство - определить статический внутренний класс:

  static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
      TestPropertyValues
          .of("spring.datasource.url=" + postgreSQLContainer.getJdbcUrl())
          .applyTo(configurableApplicationContext.getEnvironment());
    }
  }

ApplicationContextInitializer можно использовать для программной инициализации контекста Spring перед обновлением контекста.Теперь подключите класс инициализатора контекста, добавив аннотации на уровне класса теста с помощью ContextConfiguration:

@ContextConfiguration(initializers = Initializer.class)

Документы:

ApplicationContextInitializer

ContextConfiguration

...