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

Android平台OkHttp文件下载MockWebServer测试响应体为空问题

解决MockWebServer测试OkHttp文件下载时文件长度为0的问题

你遇到的核心问题确实出在MockResponse响应体的设置方式上,咱们一步步拆解修复:

问题根源分析

你的测试代码里构建响应体的逻辑有两处疏漏:

  • 重复调用buffer()导致流指针异常:Okio.buffer(Okio.source(f)).buffer()连续两次包装流,会让MockResponse读取到一个空的数据源
  • 手动处理流时未确保指针回到文件起始位置:即使去掉多余的buffer(),如果文件流之前被读取过(比如调试时的操作),指针可能停在文件末尾,导致无内容可读

修复方案(二选一即可)

方案1:直接用MockResponse的setBody(File)(最简洁可靠)

MockWebServer已经内置了对File的支持,会自动处理文件流的读取和关闭,完全不需要手动操作Okio:

// 替换原响应体设置代码
mockWebServer.enqueue(MockResponse().setBody(f))

方案2:正确构建BufferedSource(适合需要自定义流的场景)

如果必须手动处理文件流,要确保只包装一次buffer,并且指针回到文件开头:

val source = Okio.buffer(Okio.source(f))
source.seek(0) // 强制将读取指针重置到文件起始位置
mockWebServer.enqueue(MockResponse().setBody(source))

额外验证点

确认你的URL解析逻辑匹配:
你设置的parser是{ mockWebServer.url("/$it") },当调用downloadFile("test.html", destFile)时,最终请求的URL是mockWebServer.baseUrl() + "/test.html",和MockWebServer enqueue的响应是匹配的,这部分没问题。

测试验证

修改后重新运行测试,下载后的destFile.length()应该会等于原文件的66字节,断言顺利通过。另外,真实下载能正常运行也验证了生产代码的逻辑是没问题的,问题确实出在MockResponse的响应体配置上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:37