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

Spring单元测试使用WireMock模拟Feign调用出现EOF异常如何解决

问题排查及解决方案

核心原因定位

你遇到的EOFException: \n not found错误是OkHttp客户端读取HTTP响应时,连接被服务端提前断开导致的,根因来自WireMock的端口配置错误:

  • WireMockClassRule(int httpPort, int httpsPort) 构造函数的第一个参数是HTTP服务端口,第二个参数是HTTPS服务端口
  • 你当前配置8088为HTTPS端口,但Feign调用的是http://localhost:8088/api走HTTP协议,请求发到HTTPS端口时WireMock会直接断开TCP连接,没有返回合法的HTTP响应,导致OkHttp读流时抛出EOF异常。

修复步骤

1. 修正端口调用逻辑

两种方案二选一即可:

  • 方案一:修改Feign的配置,测试环境调用WireMock的HTTP端口8087,不要用8088
  • 方案二:实例化WireMock时只指定HTTP端口为8088,不要传第二个参数:
public static WireMockClassRule wireMockRule = new WireMockClassRule(8088);

2. 修复测试类注解不兼容问题

你当前用的是JUnit4的@RunWith(SpringRunner.class)、@Rule、@ClassRule,但@BeforeEach是JUnit5的注解,这个注解不会被JUnit4执行,导致WireMock的重置逻辑无效。改成JUnit4的@Before注解即可:

@Before
void setUp() {
    WireMock.reset();
}

3. 优化WireMock响应配置

你代码中响应体末尾的换行符写反了斜杠/n,应该是\n,另外可以添加Content-Length头避免传输编码问题:

wireMockRule.stubFor(WireMock.post(WireMock.urlEqualTo("/api"))
        .willReturn(WireMock.aResponse()
                .withHeader("Content-Type", "application/json")
                .withStatus(200)
                .withBody("{\"token\":\"1234\"}\n")
                .withContentLength("{\"token\":\"1234\"}\n".getBytes().length)
        )
);

验证步骤

修改后启动测试,先查看WireMock的请求匹配记录,确认请求已经被正确匹配到Stub,没有返回404/直接断连的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:51:04