Testcontainers и Spring Boot 1.5

Мы все еще используем Spring Boot 1.5.x и хотим начать использовать TestContainers. Однако все примеры относятся к Spring boot 2.x, который использует класс TestPropertyValues, доступный только в 2.x. Возможно ли вообще применить новые значения свойств к настраиваемому контексту в 1.5.x?

Это код, работающий в 2.x:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(initializers = {UserRepositoryTCIntegrationTest.Initializer.class})
public class UserRepositoryTCIntegrationTest extends UserRepositoryCommonIntegrationTests {

    @ClassRule
    public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:11.1")
      .withDatabaseName("integration-tests-db")
      .withUsername("sa")
      .withPassword("sa");

    static class Initializer
      implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
            TestPropertyValues.of(
              "spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),
              "spring.datasource.username=" + postgreSQLContainer.getUsername(),
              "spring.datasource.password=" + postgreSQLContainer.getPassword()
            ).applyTo(configurableApplicationContext.getEnvironment());
        }
    }

}


person Mejmo    schedule 26.04.2019    source источник


Ответы (2)


хороший вопрос :). У вас есть разные варианты настройки тестового контекста с помощью Spring Boot 1.5 + TestContainers. Вместо использования косвенного способа путем установки свойств источника данных с динамическими значениями (как в вашем примере кода) вы можете использовать следующую опцию:

Предоставить компонент DataSource Bean через @TestConfiguration

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class YourRepositoryIntTest {

    @Autowired
    private YourRepository sut;

    @Test
    public void testMethod() {
        // Given
        String expectedId = "SOMEID";

        // When
        Entity entity = sut.testMethod();

        // Then
        Assertions.assertThat(entity.getId()).isEqualTo(expectedId);
    }


    @TestConfiguration
    public static class Config {
        @Bean
        public MySQLContainer testContainer() {
            MySQLContainer container = new MySQLContainer();
            container.start();

            return container;
        }

        @Bean
        @Primary
        public DataSource dataSource(MySQLContainer container) {
            return DataSourceBuilder.create()
                    .url(container.getJdbcUrl())
                    .username(container.getUsername())
                    .password(container.getPassword())
                    .driverClassName(container.getDriverClassName())
                    .build();
        }
    }
}
person judomu    schedule 28.04.2019

Контейнеры базы данных можно запустить, просто используя Схема URL JDBC:

application.properties

spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.url=jdbc:tc:postgresql:11://localhost/test

Примечание: Testcontainers должен быть в пути к классам вашего приложения во время выполнения, чтобы это работало.

person timomeinen    schedule 14.08.2019