测试容器和 Spring Boot 1.5

Testcontainers and Spring Boot 1.5

我们仍在使用 Spring Boot 1.5.x,我们想开始使用 TestContainers。但是,所有示例都使用 Spring 引导 2.x,它使用 TestPropertyValues class 仅在 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());
        }
    }

}

问得好:)。您有不同的选项来使用 Spring Boot 1.5 + TestContainers 设置您的测试上下文。您可以使用以下选项,而不是通过使用动态值设置数据源属性来使用间接方式(如在您的示例代码中):

通过@TestConfiguration 提供DataSource Bean

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

只需使用 JDBC URL scheme:

即可启动数据库容器

application.properties

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

注意: 测试容器需要在运行时位于应用程序的类路径中才能正常工作