QuarkusTestResourceLifecycleManager的start()属性不生效问题
核心原因说明
Javadoc使用“应当”表述、配置无法读取的核心逻辑是:QuarkusTestResourceLifecycleManager.start() 返回的配置Map不会被主动写入JVM系统属性表,这些配置会直接注入Quarkus自身的配置上下文,因此直接调用System.getProperty()无法读取到对应值。
无法通过@ConfigProperty注入拿到配置,均为使用方式错误导致,常见触发场景:
- 未正确注册测试资源:编写完
MyWireMockResource后,必须在测试类上添加@QuarkusTestResource(MyWireMockResource.class)注解,否则资源类的start()方法不会被触发,不会生成对应配置。如需全局生效,要通过Java SPI机制注册资源类,不能仅依赖类注解。 - 注入场景不符合CDI规范:
@ConfigProperty注入仅对Quarkus CDI容器管理的Bean生效,在自行实例化的普通对象、静态代码块、测试资源类内部非生命周期方法中读取配置,都无法拿到注入值。
正确使用方式
- 首先在测试类上正确注册测试资源,之后直接在CDI管理的测试类实例中注入配置即可:
@QuarkusTest @QuarkusTestResource(MyWireMockResource.class) public class BusinessServiceTest { // 直接注入即可拿到start()返回的配置值 @ConfigProperty(name = "some.service.url") String serviceUrl; @Test void testServiceCall() { // 此处serviceUrl值为 localhost:8090 // 直接编写测试逻辑即可 } }
- 如果你确实需要兼容
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
相关产品推荐
相关产品推荐

