Тестконтейнеры и Spring Boot 1.5 - PullRequest
0 голосов
/ 26 апреля 2019

Мы все еще используем 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());
        }
    }

}

1 Ответ

2 голосов
/ 28 апреля 2019

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

Предоставление компонента источника данных через @ 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();
        }
    }
}
...