gpt4 book ai didi

java - 如何使用两个不同的驱动程序重用 `testcontainers` 容器?

转载 作者:行者123 更新时间:2023-12-03 08:10:03 26 4
gpt4 key购买 nike

我在同一应用程序中同时使用 r2dbc 和 Liquibase。但是,Liquibase 无法使用 r2dbc 运行迁移,因此我需要为此使用单独的 jdbc 驱动程序。

我遵循了解决方案here ,并使用 testcontainers 进行测试,因此我的 application-test.yaml 看起来完全像这样:

spring:
liquibase:
url: jdbc:tc:postgresql:14.1:///testdb
r2dbc:
url: r2dbc:tc:postgresql:///testdb?TC_IMAGE_TAG=14.1

这工作得很好,迁移已启动,然后查询就可以运行。问题是,这会启动两个不同的容器!因此,迁移针对其中一个运行,查询针对另一个,因此它们发现数据库为空。

有什么方法可以告诉 testcontainers 对两个连接使用同一个容器。

最佳答案

当您使用 Testcontainers' JDBC support 时,您可以通过在 jdbc url 中添加 tc 来配置,容器的生命周期是自动管理的。由于您有两个不同的 url,因此您将获得 2 个容器。

相反,您可以选择不同的方式来管理生命周期,从而获得更多控制权。

您可以 do it yourself通过创建容器实例并调用 start()/stop() 或例如使用 JUnit integration这将使容器生命周期与测试生命周期相对应。

例如,对于 JUnit5,您可以使用 @Testcontainers 标记类,并使用 @Container 标记字段,如下所示:

@Testcontainers
class MixedLifecycleTests {
@Container
private static PostgreSQLContainer postgresqlContainer = new PostgreSQLContainer();
}

由于您正在开发 Spring 应用程序,因此您希望将其配置为使用容器,为此请使用 @DynamicPropertySource:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/DynamicPropertySource.html

简而言之,您用它标记一个方法,并在其中配置 Spring 以使用容器中的数据库:

@DynamicPropertySource
static void redisProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgresqlContainer:: getJdbcUrl);
registry.add("spring.datasource.username", postgresqlContainer::getUsername);
registry.add("spring.datasource.password", postgresqlContainer::getPassword);

registry.add("spring.r2dbc.url", () -> "r2dbc:postgresql://"
+ postgreSQLContainer.getHost() + ":" + postgreSQLContainer.getFirstMappedPort()
+ "/" + postgreSQLContainer.getDatabaseName());
registry.add("spring.r2dbc.username", postgreSQLContainer::getUsername);
registry.add("spring.r2dbc.password", postgreSQLContainer::getPassword);
}

请注意,由于您的应用使用 r2dbc 而 Liquibase 使用非响应式 jdbc,因此您应该配置两者。

关于java - 如何使用两个不同的驱动程序重用 `testcontainers` 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71103813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com