我正在尝试对使用 jdbc postgres 连接的 Java 应用程序进行集成测试。
在集成测试中,我生成了两个测试容器,一个是应用程序,一个是 postgres。
我如何在应用程序中注入
postgresDB.getJdbcUrl()
?
当前我有一个
datasource.properties
文件,应用程序将其用于 jdbc 连接。
在集成测试文件夹中,我有另一个
datasource-test.properties
文件已加载到应用程序测试容器中。
datasource-test.properties
是在postgres测试容器启动后动态创建的,但应用程序容器在动态创建datasource-test.properties
之前启动。
我可以使用这种方法吗?在另一个测试容器创建此文件后,如何在测试容器中加载属性文件?
如果没有,我需要类似于 Spring Boot 的
@DynamicPropertySource
的东西,但我的应用程序不是 Spring。
在这种情况下有两件事需要考虑。两个容器应该位于同一网络中,以便它们可以相互通信,并且应用程序容器应该等待 postgres 容器,因为它是依赖项。在下面的示例中,您可以看到如何使用这些内容的草稿。
Network network = Network.newNetwork();
PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")
.withNetwork(network)
.withNetworkAliases("postgres");
GenericContainer<?> app = new GenericContainer<>("my-app:0.0.1")
.withNetwork(network)
.withExposedPorts(8080)
.dependsOn(postgres);
postgres.start();
app.start();
创建应用程序容器时,可以使用
jdbc:postgresql://postgres:5432/test
,因为现在两个容器都在同一网络中,它们可以使用网络别名相互通信,而且我们可以直接使用 postgres 的端口 5432
而不是随机端口.
注意:
PostgreSQLContainers
仍然公开5432
的随机端口,但是当您想要针对数据库进行测试时应该使用该端口,但事实并非如此,因为目标是测试与数据库通信的容器化应用程序.
您需要这部分来动态加载属性
@DynamicPropertySource
static void postgresProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
registry.add("spring.datasource.driverClassName", postgres::getDriverClassName);
}