如何将 Testcontainers Cassandra 与 Spring Data for Apache Cassandra 一起使用?

Max*_*Max 5 cassandra spring-boot spring-data-cassandra spring-boot-test testcontainers

我为与 Cassandra 一起使用的 Spring Boot 应用程序开发了集成测试。我CassandraTemplate用于与 Cassandra 通信。

我对数据库src/test/resources/application.properties有以下配置:

spring.data.cassandra.contact-points=cassandra-host
spring.data.cassandra.port=9042
Run Code Online (Sandbox Code Playgroud)

Testcontainers使用 Cassandra创建,我尝试了两种方法:

1) https://niels.nu/blog/2017/spring-cassandra-integration-tests.html

@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = {ExampleApplication.class})
@ContextConfiguration(initializers = CounterIntegrationTestContainers.Initializer.class)
@EnableConfigurationProperties
public class CounterIntegrationTestContainers extends CounterIntegrationTest {
    @ClassRule
    public static GenericContainer cassandra =
            new GenericContainer("cassandra:3")
                    .withExposedPorts(9042);

    public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
            EnvironmentTestUtils.addEnvironment(
                "testcontainers",
                configurableApplicationContext.getEnvironment(),
                "cassandra.host=" + cassandra.getContainerIpAddress(),
                "cassandra.port=" + cassandra.getMappedPort(9042)
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2) https://www.baeldung.com/spring-boot-testcontainers-integration-test - 在本例中我们可以看到 postgresql 容器,但我将其更改为 Cassandra:

public class BaeldungPostgresqlContainer extends PostgreSQLContainer<BaeldungPostgresqlContainer> {
    private static final String IMAGE_VERSION = "postgres:11.1";
    private static BaeldungPostgresqlContainer container;
 
    private BaeldungPostgresqlContainer() {
        super(IMAGE_VERSION);
    }
 
    public static BaeldungPostgresqlContainer getInstance() {
        if (container == null) {
            container = new BaeldungPostgresqlContainer();
        }
        return container;
    }
 
    @Override
    public void start() {
        super.start();
        System.setProperty("DB_URL", container.getJdbcUrl());
        System.setProperty("DB_USERNAME", container.getUsername());
        System.setProperty("DB_PASSWORD", container.getPassword());
    }
 
    @Override
    public void stop() {
        //do nothing, JVM handles shut down
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我有一个问题。当我开始测试时,我无法创建CassandraTemplatebean,因为 Cassandra 服务器不可用。看来,Spring Data 在创建数据库服务器的测试 bean 之前尝试对 Cassandra 进行健康检查。

有没有办法将 Testcontainers Cassandra 与 Spring Data for Apache Cassandra 一起使用?

Max*_*Max 3

看来我可以用这样的类运行测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(
        initializers = CassandraTestPrjApplicationTests.Initializer.class
)
public class CassandraTestPrjApplicationTests {

    @Test
    public void contextLoads() {
    }

    public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            GenericContainer<?> cassandra =
                    new GenericContainer<>("cassandra:3").withExposedPorts(9042);

            cassandra.start();

            TestPropertyValues.of(
                    "spring.data.cassandra.contact-points=" + cassandra.getContainerIpAddress(),
                    "spring.data.cassandra.port=" + cassandra.getMappedPort(9042)
            ).applyTo(applicationContext);
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

这是我的gradle.build

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-cassandra'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    testCompile "org.testcontainers:testcontainers:1.12.0"
    testCompile "org.testcontainers:cassandra:1.12.0"
}
Run Code Online (Sandbox Code Playgroud)