使用Espresso搭配MockWebServer无法Mock API响应问题求助
MockWebServer + Espresso 网络响应打桩问题修复方案
当前实现方向正确,MockWebServer是Android端拦截网络请求、返回自定义响应的标准实现方案,和Cypress的cy.intercept逻辑一致,区别是Android端需要手动将应用的请求地址指向MockWebServer,无法自动全局拦截,你遇到的问题基本是遗漏了配置步骤或者细节错误。
必须补充的修改点
1. 把应用请求地址指向MockWebServer
这是最容易遗漏的核心配置,你的MockWebServer启动在8080端口,但应用默认还是请求正式/测试环境的线上地址,自然不会收到你设置的mock响应:- 如果用模拟器测试,把应用的BaseUrl改为
http://10.0.2.2:8080(这是模拟器访问宿主机本地服务的固定地址);如果用真机测试,需要保证手机和电脑在同一局域网,把BaseUrl改为电脑的局域网IP加8080端口。 - 也可以给测试包的OkHttpClient添加重定向拦截器,无需修改业务代码的BaseUrl,直接把所有请求动态转发到MockWebServer地址。
- 如果用模拟器测试,把应用的BaseUrl改为
2. 修复现有代码的明显错误
你当前的代码存在以下可直接导致测试失败的问题:- Mock响应的
message字段存在拼写错误:emccail、Passddword,和你断言的正确文本完全不一致,先把mock响应里的文本修改为和断言内容完全匹配的内容。 - 没有添加MockWebServer的销毁逻辑,多次运行会出现端口占用问题,补充After钩子:
@After fun tearDown() { mockWebServer.shutdown() } - 测试类需要添加
@RunWith(AndroidJUnit4::class)注解,否则Espresso的相关规则不会生效。
- Mock响应的
3. 逐步调试排查问题
按以下步骤可以快速定位瓶颈:- 点击登录按钮后添加代码
val request = mockWebServer.takeRequest(),打印request.path,如果拿不到请求,说明请求没有转发到MockWebServer,优先排查BaseUrl配置、网络权限、防火墙拦截问题。 - 如果能拿到请求,打印
request.body确认请求参数符合预期,同时打印MockWebServer返回的响应内容,确认和你设置的mock body一致。 - 如果响应正确但断言失败,可能是弹窗/Toast的文本为富文本格式,可暂时把
withText替换为withSubstring做模糊匹配,定位是否是文本匹配规则的问题。
- 点击登录按钮后添加代码
内容的提问来源于stack exchange,提问作者Emjey
相关产品推荐
相关产品推荐

