You need to enable JavaScript to run this app. 使用Espresso搭配MockWebServer无法Mock API响应问题求助
优惠活动
大模型
产品
解决方案
定价
更多

使用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地址。
  • 2. 修复现有代码的明显错误

    你当前的代码存在以下可直接导致测试失败的问题:
    • Mock响应的message字段存在拼写错误:emccail、Passddword,和你断言的正确文本完全不一致,先把mock响应里的文本修改为和断言内容完全匹配的内容。
    • 没有添加MockWebServer的销毁逻辑,多次运行会出现端口占用问题,补充After钩子:
      @After
      fun tearDown() {
          mockWebServer.shutdown()
      }
      
    • 测试类需要添加@RunWith(AndroidJUnit4::class)注解,否则Espresso的相关规则不会生效。
  • 3. 逐步调试排查问题

    按以下步骤可以快速定位瓶颈:
    • 点击登录按钮后添加代码val request = mockWebServer.takeRequest(),打印request.path,如果拿不到请求,说明请求没有转发到MockWebServer,优先排查BaseUrl配置、网络权限、防火墙拦截问题。
    • 如果能拿到请求,打印request.body确认请求参数符合预期,同时打印MockWebServer返回的响应内容,确认和你设置的mock body一致。
    • 如果响应正确但断言失败,可能是弹窗/Toast的文本为富文本格式,可暂时把withText替换为withSubstring做模糊匹配,定位是否是文本匹配规则的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:09:02