0

我们仍在使用 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());
        }
    }

}

4

2 回答 2

2

好问题 :)。您有不同的选项来使用 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();
        }
    }
}
于 2019-04-28T12:27:57.387 回答
0

只需使用JDBC URL 方案即可启动数据库容器:

应用程序属性

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

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

于 2019-08-14T16:02:31.860 回答