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

WireMock并行调用未返回存根值,疑似竞态问题求助

WireMock并发测试出现NullPointerException问题排查

我在并行执行测试时遇到问题,使用的是WireMock(v2.27.2),怀疑是配置有误或存在内部竞态条件。以下是使用固定线程池运行100个线程的示例代码:

public class WiremockTest {
  private static final String BODY = "body";
  private static WireMockServer wireMockServer;

  @BeforeAll
  public static void setup() {
    wireMockServer = new WireMockServer(wireMockConfig().dynamicPort());
    wireMockServer.start();
  }

  @Test
  void concurrentWireMock() throws InterruptedException {
    final var wiremock = new WireMock("localhost", wireMockServer.port());
    final var okHttp = new OkHttpClient.Builder().build();

    var exec = Executors.newFixedThreadPool(12);
    for (int i = 0; i < 100; i++) {
      exec.submit(() -> execute(wiremock, okHttp));
    }

    exec.shutdown();
    exec.awaitTermination(5, TimeUnit.SECONDS);
  }

  void execute(WireMock wiremock, OkHttpClient okHttp) {
    UUID uuid = UUID.randomUUID();
    var url = String.format("/v1/item/%s", uuid);

    wiremock.register(get(url)
        .willReturn(
            aResponse()
                .withStatus(HttpStatus.OK.value())
                .withBody(BODY)
        ));

    var getRequest = new Request.Builder()
        .url(wireMockServer.baseUrl() + url)
        .get()
        .build();
    try {
      var response = okHttp.newCall(getRequest).execute();
      String actualBody = response.body().string();
      if (!actualBody.equals(BODY)) {
        System.out.printf("Body didn't match. Expected:\n%s\nActual:\n%s\n", BODY, actualBody);
      }
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
}

运行上述代码后,100次执行中通常会出现1-2次错误,WireMock抛出NullPointerException(NPE)。某次错误的输出摘要如下:

Body didn't match. Expected:
body
Actual:
<html>
<head>
[...]
<tr><th>URI:</th><td>/v1/item/e318684f-e061-4fee-9acb-36027aa88c5b</td></tr>
<tr><th>STATUS:</th><td>500</td></tr>
<tr><th>MESSAGE:</th><td>java.lang.NullPointerException</td></tr>
<tr><th>SERVLET:</th><td>com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet-2a87176b</td></tr>
<tr><th>CAUSED BY:</th><td>java.lang.NullPointerException</td></tr>
</table>
<h3>Caused by:</h3><pre>java.lang.NullPointerException
    at com.github.tomakehurst.wiremock.servlet.WireMockHandlerDispatchingServlet.service(WireMockHandlerDispatchingServlet.java:120)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:760)
[...]
</body>
</html>

我想确认是否是我的配置方式有误,从而触发了这个问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:45:00