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
相关产品推荐
相关产品推荐

