如何获取Quarkus Kafka DevServices的Bootstrap Servers用于测试?
解决Quarkus DevServices Kafka地址注入自定义配置的问题
解决方案1:修正配置文件格式(最简单尝试)
先检查配置的语法,去掉bootstrap.servers的引号,修改测试环境配置:
%test.my-app.broker-one-properties.bootstrap.servers=${kafka.bootstrap.servers} %test.my-app.broker-two-properties.bootstrap.servers=${kafka.bootstrap.servers}
Quarkus的SmallRye Config处理嵌套属性时,不带引号的写法更直接,之前的引号可能导致属性无法正确解析和替换。
解决方案2:自定义TestResource动态覆盖配置
如果方案1无效,通过自定义测试资源在Quarkus启动前注入DevServices生成的Kafka地址:
- 创建测试资源类:
import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; import org.eclipse.microprofile.config.ConfigProvider; import java.util.Map; public class KafkaDevServicesOverrideResource implements QuarkusTestResourceLifecycleManager { @Override public Map<String, String> start() { // 获取DevServices启动的RedPanda地址 String devBootstrap = ConfigProvider.getConfig().getValue("kafka.bootstrap.servers", String.class); // 返回要覆盖的自定义配置 return Map.of( "my-app.broker-one-properties.bootstrap.servers", devBootstrap, "my-app.broker-two-properties.bootstrap.servers", devBootstrap ); } @Override public void stop() { // DevServices会自动停止容器,无需额外清理 } }
- 在测试类上启用该资源:
import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; @QuarkusTest @QuarkusTestResource(KafkaDevServicesOverrideResource.class) public class YourKafkaIntegrationTest { // 编写测试用例 }
该方法会在Quarkus测试容器启动前,将DevServices生成的地址注入到你的自定义配置属性中。
解决方案3:测试代码中动态修改配置
如果你的配置是通过ConfigMapping注入的,可以在测试初始化阶段替换bootstrap地址:
- 定义配置映射类:
import io.smallrye.config.ConfigMapping; import java.util.Properties; @ConfigMapping(prefix = "my-app") public interface AppKafkaConfigs { Properties brokerOneProperties(); Properties brokerTwoProperties(); }
- 在测试类中注入并修改配置:
import io.quarkus.test.junit.QuarkusTest; import jakarta.inject.Inject; import org.eclipse.microprofile.config.Config; import org.junit.jupiter.api.BeforeEach; @QuarkusTest public class YourKafkaTest { @Inject Config config; @Inject AppKafkaConfigs appKafkaConfigs; @BeforeEach void setupBootstrapServers() { String devBootstrap = config.getValue("kafka.bootstrap.servers", String.class); appKafkaConfigs.brokerOneProperties().setProperty("bootstrap.servers", devBootstrap); appKafkaConfigs.brokerTwoProperties().setProperty("bootstrap.servers", devBootstrap); } // 测试用例代码 }
注意:如果使用不可变的ConfigMapping,需要添加namingStrategy = ConfigMapping.NamingStrategy.VERBATIM注解,并确保Properties实例是可变的。
内容的提问来源于stack exchange,提问作者Jan Thomä
相关产品推荐
相关产品推荐

