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

