Динамически добавлять источники свойств в SpringBootTest - PullRequest
1 голос
/ 18 мая 2019

Аналогично Набор модульных тестов Springboot @Configuration Properties динамически , но контекст другой.

В моем случае у меня есть TestContainer , работающий с пользовательской базой данных MySQL, котораязаполнен большим количеством данных (без использования подхода пакетной загрузки SQL, потому что данные являются анонимной копией производства, а выполнение этого с помощью SQL делает время загрузки контейнера 20 минут против 2 минут).

Пока мой тест выглядит следующим образом

@RunWith(SpringRunner.class)
@SpringBootTest(
    classes = {
        Bootstrap.class
    }
)
public class ITFakeDB {
    @ClassRule
    public static final GenericContainer DB = new GenericContainer("devdb")
        .withExposedPorts(3306);
    @Autowired
    private DataSource dataSource;

    @Autowired
    private Users users;

    @Test
    public void testDatabaseIsUp() {
        assertTrue(DB.getMappedPort(3306) != 0);
    }

    @Test
    public void testUser() {
        Optional<User> user = users.findByLoginName("mimi");
        assertTrue(users.isPresent());
    }
}

Что я хочу сделать, так это каким-то образом установить spring.datasource.url (или в моем случае datasources.schema1.url, потому что я сделал источник данных маршрутизации ) втот, который используется DB

1 Ответ

2 голосов
/ 18 мая 2019

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

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

  static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
      String url = "jdbc:mysql://" + DB.getContainerIpAddress() + ":" + DB.getMappedPort(3306) + "/my_db";

      TestPropertyValues
          .of("datasources.schema1.url=" + url)
          .applyTo(configurableApplicationContext.getEnvironment());
    }
  }

Примечание: я предположил, что url является производным от IP-адреса, порта и имени БД. Вы можете изменить эту часть по мере необходимости, но основная идея остается.

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

@ContextConfiguration(initializers = Initializer.class)

Docs:

ApplicationContextInitializer

ContextConfiguration

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...