You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus集成测试中,构建后如何更新连接字符串配置?

解决方案

核心思路是利用Quarkus的TestResourceLifecycleManager在应用启动前注入动态生成的配置,覆盖测试环境的静态配置项。具体步骤如下:

1. 修改测试资源类,返回动态配置

在BlobStorageTestResource的start方法中,将生成的连接字符串以键值对形式返回,Quarkus会自动将这些配置注入到应用的配置系统中:

@Singleton
public class BlobStorageTestResource implements QuarkusTestResourceLifecycleManager {

    @Container
    final GenericContainer azurite = new GenericContainer(DockerImageName.parse("mcr.microsoft.com/azure-storage/azurite"))
            .withExposedPorts(10000)
            .withCommand("azurite-blob --blobHost 0.0.0.0 --blobPort 10000 --loose");

    @Override
    public Map<String, String> start() {
        azurite.start();

        String connectionString = String.format("DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:%d/devstoreaccount1;", azurite.getFirstMappedPort());

        BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
                .connectionString(connectionString)
                .buildClient();

        blobServiceClient.createBlobContainer("conversion");

        // 返回配置键值对,替换测试环境的连接字符串
        return Map.of("blob.config.connection-string", connectionString);
    }

    @Override
    public void stop() {
        azurite.stop();
    }
}

2. 确保配置绑定正确

你的blobConfig需要正确映射上述返回的配置键。如果使用@ConfigProperties绑定:

@ConfigProperties(prefix = "blob.config")
public class BlobConfig {
    private String connectionString;
    private String containerName;

    // 生成getter和setter
    public String getConnectionString() {
        return connectionString;
    }

    public void setConnectionString(String connectionString) {
        this.connectionString = connectionString;
    }

    public String getContainerName() {
        return containerName;
    }

    public void setContainerName(String containerName) {
        this.containerName = containerName;
    }
}

如果使用@ConfigProperty直接注入,调整生产者方法:

@Produces
@Singleton
@IfBuildProfile("test")
BlobContainerAsyncClient provideTestBlobContainer(
        @ConfigProperty(name = "blob.config.connection-string") String connectionString,
        @ConfigProperty(name = "blob.config.container-name") String containerName) {
    return new BlobServiceClientBuilder()
            .connectionString(connectionString)
            .buildAsyncClient()
            .getBlobContainerAsyncClient(containerName);
}

3. 在测试类中启用测试资源

在集成测试类上添加@QuarkusTestResource注解,指定使用上述测试资源:

@QuarkusTest
@QuarkusTestResource(BlobStorageTestResource.class)
public class BlobStorageIntegrationTest {
    // 测试逻辑
}

原理说明

Quarkus会在应用启动前执行TestResourceLifecycleManager的start方法,返回的配置会覆盖application-test.properties中的对应静态配置。当你的@Produces方法创建BlobContainerAsyncClient时,读取到的已经是动态生成的连接字符串,解决了端口动态映射导致的配置不匹配问题。

内容的提问来源于stack exchange,提问作者Ricardo de Vries

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:20:00