Haf*_*Haf 2 java spring testcontainers r2dbc
我在同一个应用程序中使用 r2dbc 和 Liquibase。但是,Liquibase 无法使用 r2dbc 运行迁移,因此我需要为此使用单独的 jdbc 驱动程序。
我按照这里的解决方案,并使用 testcontainers 进行测试,所以我的application-test.yaml看起来完全像这样:
spring:
liquibase:
url: jdbc:tc:postgresql:14.1:///testdb
r2dbc:
url: r2dbc:tc:postgresql:///testdb?TC_IMAGE_TAG=14.1
Run Code Online (Sandbox Code Playgroud)
这工作得很好,迁移启动,然后查询就可以运行。问题是,这会启动两个不同的容器!因此,迁移针对其中一个运行,查询针对另一个,因此他们发现数据库为空。
有什么方法可以告诉 testcontainers 对两个连接使用相同的容器。
当您使用 Testcontainers 的JDBC 支持(通过添加tcjdbc url 进行配置)时,容器的生命周期会自动管理。由于您有两个不同的 url,因此您将获得 2 个容器。
相反,您可以选择不同的方式来管理生命周期,从而获得更多控制权。
您可以通过创建容器实例并调用来自己完成此操作start()/stop(),或者例如使用JUnit 集成,它将容器生命周期与测试生命周期相对应。
例如,对于 JUnit5,您可以使用 标记类,@Testcontainers并使用 标记字段@Container,如下所示:
@Testcontainers
class MixedLifecycleTests {
@Container
private static PostgreSQLContainer postgresqlContainer = new PostgreSQLContainer();
}
Run Code Online (Sandbox Code Playgroud)
由于您正在开发 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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,由于您的应用程序使用 r2dbc 并且 Liquibase 使用非反应式 jdbc,因此您应该配置两者。