Dynamically add property sources to SpringBootTest

You can manually override the property from within your Spring-boot test by using ContextConfiguration and ApplicationContextInitializer.

Override the property - define a static inner class:

  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());
    }
  }

Note: I have assumed that the url is derived from the ip address, port and db name. You may change that part as needed but the core idea remains.

ApplicationContextInitializer can be used for programmatically initializing a Spring context before context refresh. Now, wire up the context initializer class by annotating at test class level with ContextConfiguration:

@ContextConfiguration(initializers = Initializer.class)

Docs:

ApplicationContextInitializer

ContextConfiguration


While the previous answer should work, Spring Framework 5.2.5 (that is included into Spring Boot 2.2.6) has introduced a new @DynamicPropertySource annotation exactly for that case:

@DynamicPropertySource
static void initializeDatasource(DynamicPropertyRegistry registry) {
    String ip    = DB.getContainerIpAddress();
    Integer port = DB.getMappedPort(3306);
    String url   = String.format("jdbc:mysql://%s:%d/my_db", ip, port);
    
    registry.add("datasources.schema1.url", url);
}

See for details:

  • Blog: @DynamicPropertySource in Spring Framework 5.2.5 and Spring Boot 2.2.6
  • Documentation: Context Configuration with Dynamic Property Sources