对于您的情况,您应该为 R2dbc 连接而不是 Jdbc 连接创建属性。
您必须手动计算 R2dbc URL 而不是 Jdbc URL。
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());
更简单地说,您可以为测试容器创建tc
基于配置文件的应用程序配置。
# src/test/resources/application-tc.properties
spring.r2dbc.url=r2dbc:tc:mysql:///databasename?TC_IMAGE_TAG=8
url 中的tc
会自动启动一个 testcontaiens docker。请参阅TestContainers R2dbc 支持。
然后,您还可以通过@TestConfiguration
.
@DataR2dbcTest
@TestInstance(TestInstance.Lifecycle.PER_METHOD)
@ActiveProfiles("tc")// activate the `tc` profile.
public class TestcontainersPostRepositoryTest {
@TestConfiguration
static class TestConfig {
@Bean
public ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) {
ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
initializer.setConnectionFactory(connectionFactory);
CompositeDatabasePopulator populator = new CompositeDatabasePopulator();
populator.addPopulators(new ResourceDatabasePopulator(new ClassPathResource("schema.sql")));
populator.addPopulators(new ResourceDatabasePopulator(new ClassPathResource("data.sql")));
initializer.setDatabasePopulator(populator);
return initializer;
}
}
@Autowired
DatabaseClient client;
@Autowired
PostRepository posts;
//your tests...
我有一些测试容器的例子。
通过 R2dbc url 启动 Contrainer,请参阅此 R2dbc MySQL 示例。
使用 Junit 手动设置,请参阅此 R2dbc PostgresSQL 示例。
使用 spring 初始化器类来初始化一个容器,参见这个 Neo4j Rx 示例。