我为我的spring-boot应用程序开发集成测试,它与cassandra一起工作。我用 CassandraTemplate
与Cassandra沟通。
我对数据库src/test/resources/application.properties有以下配置:
spring.data.cassandra.contact-points=cassandra-host
spring.data.cassandra.port=9042
创造 Testcontainers
对于Cassandra,我尝试了两种方法:
- 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)
);
}
}
}
- 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
}
}
所以,我有个问题。当我开始测试的时候,我发现我不能创建 CassandraTemplate
bean,因为cassandra服务器不可用。看起来,spring数据在创建数据库服务器的测试bean之前,试图对cassandra进行健康检查。
有没有办法将testcontainers cassandra与apache cassandra的spring数据一起使用?
3条答案
按热度按时间q5lcpyga1#
似乎,我可以用这样的类运行测试:
这是我的gradle.build:
z8dt9xmd2#
你能分享第一次尝试的日志吗(用@classrule)?这对我来说很有效。
也许你的测试Cassandra还没开始?默认的testcontainers超时为60秒,容器的第一个Map网络端口开始侦听。检查文件
4ktjp1zp3#
考虑到第一种方法,我将首先检查在测试执行期间运行的容器:
docker ps
并查看它是否启动(即docker守护进程启动)并显示正确的端口。那就试试吧
telnet
以确保服务在默认的60秒超时期间启动。容器启动似乎足够了,但如果
telnet
在此期间不连接,请尝试像这样增加它如果容器公开了正确的端口,但测试没有连接到它,请确保在测试中使用正确的配置参数。我看到了
spring.data.cassandra.contact-points
,您发送的示例使用了一点不同的配置,请检查集群初始化代码中的配置参数是否正确(例如。"${contact-points}"
而不是"${container.host}"
反之亦然)。检查集成测试逻辑是否按预期工作(testcontainers配置有问题)的另一个选项是在运行测试之前启动cassandra容器并对其主机和端口进行硬编码。
希望这有帮助。