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

Quarkus 3.19.1与WireMock 3.0.1中verify丢失ThreadLocal上下文问题

WireMock与Quarkus测试资源集成的问题

问题场景与现象

  • 基于自定义QuarkusTestResourceLifecycleManager实现启动WireMock独立服务器,将WireMock客户端作为注入属性提供给所有标注@QuarkusTestResource(WiremockTestResourceConfigurableLifecycleManager.class)的测试类
  • 测试接口调用正常,但执行WireMock.verify时,InheritableThreadLocal始终返回默认的localhost:8080,抛出连接拒绝错误:

    Caused by: org.apache.hc.client5.http.HttpHostConnectException: Connect to http://localhost:8080 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: no further information

  • 临时修复:在测试方法内手动执行WireMock.configureFor(wireMockClient)后,verify可正常工作,但该配置已在测试启动前的WireMockServerManager类中执行过,问题依然存在

问题代码片段

@Test
void getDrivers() {
    assert  wireMockClient != null;
    logger.info(wireMockClient.toString());

    wireMockClient.register(WireMock.get("/api/2010/drivers").willReturn(
            WireMock.aResponse().withStatus(200).withBody(jsonResponse)));

    final Response response = given()
            .when().get("/drivers")
            .then()
            .statusCode(200)
            .assertThat()
            .statusCode(SC_OK)
            .contentType(ContentType.JSON)
            .extract().as(Response.class);

    // FIXME : 加这行verify就正常!为什么InheritableThreadLocal不生效?
    // WireMock.configureFor(wireMockClient);

    verify(1,
            WireMock.getRequestedFor(WireMock.urlPathEqualTo("/api/2010/drivers")));
    logger.info("resp:{}", response ); // 执行到这里报错!
}

原因分析

问题核心在于线程上下文隔离:

  • Quarkus测试框架初始化测试资源(如WireMockServerManager)的线程,与实际执行测试方法的线程并非同一个
  • WireMock的静态配置(如configureFor)依赖InheritableThreadLocal存储客户端信息,但Quarkus的测试线程可能未正确继承该上下文,导致测试线程读取到默认的主机端口配置

解决方案

方案1:使用注入的WireMock客户端实例调用verify(推荐)

直接通过注入的wireMockClient执行验证,绕过静态ThreadLocal的依赖:

wireMockClient.verify(1, WireMock.getRequestedFor(WireMock.urlPathEqualTo("/api/2010/drivers")));

方案2:在测试方法前重新配置静态上下文

在测试类中添加@BeforeEach方法,确保每个测试线程的WireMock静态配置正确:

@BeforeEach
void setupWireMock() {
    WireMock.configureFor(wireMockClient);
}

方案3:调整测试资源的配置时机

确保WireMock.configureFor在测试线程启动后执行,而非初始化资源的主线程。可通过Quarkus测试扩展的回调机制,在测试线程上下文初始化时设置配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:15:09