如何动态加载属性到应用程序测试容器?

问题描述 投票:0回答:2

我正在尝试对使用 jdbc postgres 连接的 Java 应用程序进行集成测试。

在集成测试中,我生成了两个测试容器,一个是应用程序,一个是 postgres。

我如何在应用程序中注入

postgresDB.getJdbcUrl()

当前我有一个

datasource.properties
文件,应用程序将其用于 jdbc 连接。

在集成测试文件夹中,我有另一个

datasource-test.properties
文件已加载到应用程序测试容器中。

datasource-test.properties
是在postgres测试容器启动后动态创建的,但应用程序容器在动态创建
datasource-test.properties
之前启动。

我可以使用这种方法吗?在另一个测试容器创建此文件后,如何在测试容器中加载属性文件?

如果没有,我需要类似于 Spring Boot 的

@DynamicPropertySource
的东西,但我的应用程序不是 Spring。

java postgresql docker testcontainers testcontainers-junit5
2个回答
1
投票

在这种情况下有两件事需要考虑。两个容器应该位于同一网络中,以便它们可以相互通信,并且应用程序容器应该等待 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
的随机端口,但是当您想要针对数据库进行测试时应该使用该端口,但事实并非如此,因为目标是测试与数据库通信的容器化应用程序.


0
投票

您需要这部分来动态加载属性

@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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.