WireMock指定9999端口却尝试连接8080端口导致连接拒绝的问题排查
WireMock指定9999端口却尝试连接8080端口导致连接拒绝的问题排查
这个问题其实是WireMock客户端默认配置和你启动的服务器实例不匹配导致的,我来帮你拆解一下原因和解决方案:
问题根源
你确实在setUp()里启动了端口为9999的WireMockServer,但你代码中使用的WireMock.listAllStubMappings()、stubFor()这些静态方法,默认是连接localhost:8080的WireMock服务(这是WireMock客户端的默认端口),和你自己启动的9999端口服务器完全是两个独立的目标,所以才会出现连接8080被拒绝的错误。
两种解决方案
方案一:配置静态WireMock客户端指向你的服务器
在启动WireMockServer之后,添加一行代码配置静态客户端的目标地址和端口,让它和你的服务器对齐:
@BeforeAll public static void setUp() { // Start WireMock server with the desired hostname and port wireMockServer = new WireMockServer(wireMockConfig().port(9999).bindAddress("localhost")); wireMockServer.start(); // 配置静态WireMock客户端指向我们的服务器端口 WireMock.configureFor("localhost", 9999); }
这样所有静态的WireMock方法都会使用你指定的9999端口,不会再访问默认的8080了。
方案二:直接使用WireMockServer实例操作(更推荐)
既然你已经创建了wireMockServer实例,直接用它来管理stub和查询映射,完全绕开静态客户端的默认配置:
@Test @SneakyThrows void onlyPath_localhost() { // 使用服务器实例查询stub映射,而不是静态WireMock类 ListStubMappingsResult stubslist = wireMockServer.listAllStubMappings(); System.err.println("stubslist.getMappings().size(): " + stubslist.getMappings().size()); System.err.println("stubslist.getMappings(): " + stubslist.getMappings()); HttpRequest request; HttpResponse<String> response; // 使用服务器实例创建stub,而不是静态stubFor方法 wireMockServer.stubFor(get("/get").willReturn(ok("Hello"))); request = HttpRequest.newBuilder() .uri(new URI("http://localhost:9999/get")) .version(HttpClient.Version.HTTP_2) .GET() .build(); response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); Assertions.assertEquals("Hello", response.body()); }
这种方式更直观,直接绑定到你启动的服务器实例,避免了静态配置不一致的问题,后续维护也更清晰。
验证效果
修改完成后,无论是查询stub映射还是发送请求,都会正确指向9999端口的WireMockServer,不会再出现连接8080被拒绝的错误。
备注:内容来源于stack exchange,提问作者CodeBot
相关产品推荐
相关产品推荐

