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

