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
相关产品推荐
相关产品推荐

