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

QuarkusTestResourceLifecycleManager的start()属性不生效问题

核心原因说明

Javadoc使用“应当”表述、配置无法读取的核心逻辑是:QuarkusTestResourceLifecycleManager.start() 返回的配置Map不会被主动写入JVM系统属性表,这些配置会直接注入Quarkus自身的配置上下文,因此直接调用System.getProperty()无法读取到对应值。
无法通过@ConfigProperty注入拿到配置,均为使用方式错误导致,常见触发场景:

  • 未正确注册测试资源:编写完MyWireMockResource后,必须在测试类上添加@QuarkusTestResource(MyWireMockResource.class)注解,否则资源类的start()方法不会被触发,不会生成对应配置。如需全局生效,要通过Java SPI机制注册资源类,不能仅依赖类注解。
  • 注入场景不符合CDI规范:@ConfigProperty注入仅对Quarkus CDI容器管理的Bean生效,在自行实例化的普通对象、静态代码块、测试资源类内部非生命周期方法中读取配置,都无法拿到注入值。
正确使用方式
  1. 首先在测试类上正确注册测试资源,之后直接在CDI管理的测试类实例中注入配置即可:
@QuarkusTest
@QuarkusTestResource(MyWireMockResource.class)
public class BusinessServiceTest {

    // 直接注入即可拿到start()返回的配置值
    @ConfigProperty(name = "some.service.url")
    String serviceUrl;

    @Test
    void testServiceCall() {
        // 此处serviceUrl值为 localhost:8090
        // 直接编写测试逻辑即可
    }
}
  1. 如果你确实需要兼容System.getProperty()的读取场景,可以在start()方法中手动将配置写入系统属性,不要依赖Quarkus的自动写入:
@Override
public Map<String, String> start() {
    // 建议使用动态端口避免测试环境端口冲突,不要硬编码8090
    wireMockServer = new WireMockServer(WireMockConfiguration.options().dynamicPort());
    wireMockServer.start();

    // 编写桩逻辑
    Map<String, String> testConfig = Map.of("some.service.url", "localhost:" + wireMockServer.port());
    // 手动写入系统属性,兼容非CDI场景的读取
    testConfig.forEach(System::setProperty);
    return testConfig;
}

注意:如果@QuarkusTestResource注解设置了restrictToAnnotatedClass = true,该资源生成的配置仅对当前标注注解的测试类生效,其他测试类无法读取到对应配置,按需调整该参数即可。

内容的提问来源于stack exchange,提问作者Jmini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:18