如何测试OkHttp拦截器是否成功添加Authorization请求头?
测试OkHttp拦截器添加请求头的解决方案
核心思路
要验证拦截器是否成功添加Authorization头,关键是捕获经过拦截器处理后的请求对象——只拿响应是看不到请求头细节的。OkHttp官方提供的MockWebServer是做这类测试的标准工具,它能完整记录服务器收到的每一个请求的所有信息。
具体实现步骤
1. 添加测试依赖
确保你的测试依赖中包含MockWebServer(版本要和OkHttp主版本一致):
testImplementation 'com.squareup.okhttp3:mockwebserver:4.11.0' // 替换为你使用的OkHttp版本
2. 编写Spock测试用例
import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer import spock.lang.Specification class AuthRequestInterceptorSpec extends Specification { MockWebServer mockWebServer = new MockWebServer() OkHttpClient clientWithInterceptor def setup() { // 初始化带有目标拦截器的OkHttpClient clientWithInterceptor = new OkHttpClient.Builder() .addInterceptor(new AuthRequestInterceptor()) // 你的Auth拦截器实例 .build() mockWebServer.start() } def cleanup() { mockWebServer.shutdown() } def "拦截器应正确添加Authorization请求头"() { given: // 让MockWebServer返回一个空的成功响应 mockWebServer.enqueue(new MockResponse().setResponseCode(200)) when: // 向MockWebServer发送测试请求 Request testRequest = new Request.Builder() .url(mockWebServer.url("/api/test")) .build() clientWithInterceptor.newCall(testRequest).execute() then: // 获取MockWebServer记录的实际请求 def recordedRequest = mockWebServer.takeRequest() // 验证Authorization头存在且符合预期值 recordedRequest.getHeader("Authorization") == "Bearer your-expected-token" // 替换为拦截器要添加的实际值 } }
3. 关键细节说明
mockWebServer.takeRequest()会返回Mock服务器收到的真实请求对象,里面包含所有经过拦截器处理后的请求头、请求体等信息。- 测试完全脱离真实后端,避免外部依赖干扰测试结果,保证测试的稳定性。
- 如果拦截器中的
Authorizationtoken是动态生成的,建议把token的获取逻辑抽象成可注入的依赖(比如通过构造函数传入),这样测试时可以固定token值,方便断言。
为什么之前的测试会失败
你之前的测试只获取响应,但响应本身不会携带请求头的信息,自然无法验证拦截器是否修改了请求。只有通过MockWebServer拦截并记录请求,才能拿到经过拦截器处理后的完整请求细节,这是OkHttp拦截器功能测试的标准方案。
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

