使用Groovy内置URL时okhttp3 MockWebServer无法正常工作
问题原因及解决方案
你的测试代码抛出java.io.IOException: Invalid Http response,核心问题有两个:
1. MockResponse构造方式错误
你用Groovy的Map语法new MockResponse(status: 200, body:"Hello!")初始化MockResponse是无效的,MockWebServer的MockResponse类并不支持这种构造方式,导致生成的HTTP响应缺少合法的状态行(比如HTTP/1.1 200 OK),URL的getText()方法无法解析这种不规范的响应,从而抛出异常。
2. 未显式启动MockWebServer
虽然部分版本的MockWebServer会在调用url()时自动启动,但显式调用start()能确保服务器正常监听端口,避免潜在的连接问题。
修正后的测试代码
package org.example import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer import org.junit.jupiter.api.Test import org.junit.jupiter.api.AfterEach class MockTest { private MockWebServer mockWebServer = new MockWebServer() // 测试后关闭服务器,避免端口占用 @AfterEach void tearDown() { mockWebServer.shutdown() } @Test void test_a_mock() { mockWebServer.start() // 用链式调用正确构造MockResponse def mockResponse = new MockResponse() .setResponseCode(200) .setBody("Hello!") mockWebServer.enqueue(mockResponse) def bodyText = new URL(mockWebServer.url("/").toString()).getText() assert bodyText == "Hello!" } @Test void test_get_google() { def bodyText = new URL("https://www.google.com").text assert bodyText.size() > 0 } }
内容的提问来源于stack exchange,提问作者Chris Curvey
相关产品推荐
相关产品推荐

