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

如何获取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地址:

  1. 创建测试资源类:
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会自动停止容器,无需额外清理
    }
}
  1. 在测试类上启用该资源:
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(KafkaDevServicesOverrideResource.class)
public class YourKafkaIntegrationTest {
    // 编写测试用例
}

该方法会在Quarkus测试容器启动前,将DevServices生成的地址注入到你的自定义配置属性中。

解决方案3:测试代码中动态修改配置

如果你的配置是通过ConfigMapping注入的,可以在测试初始化阶段替换bootstrap地址:

  1. 定义配置映射类:
import io.smallrye.config.ConfigMapping;
import java.util.Properties;

@ConfigMapping(prefix = "my-app")
public interface AppKafkaConfigs {
    Properties brokerOneProperties();
    Properties brokerTwoProperties();
}
  1. 在测试类中注入并修改配置:
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ä

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:17:04