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

基于Hilt的Espresso+MockWebServer测试Idling Resource不等待API请求怎么办

Espresso测试偶发失败问题排查

核心问题定位

  • 你引入的com.jakewharton.espresso:okhttp3-idling-resource:1.0.0存在统计逻辑缺口:仅追踪OkHttp Dispatcher中正在执行的网络请求,完全不统计已入队、等待调度的请求。
    当Fragment初始化触发网络请求时,请求会先进入OkHttp的待执行队列,这个阶段IdlingResource会判定当前应用处于空闲状态,Espresso会直接跳过等待执行后续点击操作。等极短时间窗口过后请求才真正进入执行阶段,等响应返回填充RecyclerView时,Espresso的点击操作已经执行完毕,自然会出现偶发失败。这个窗口期的长度受设备性能、系统负载影响不固定,直接导致测试结果不稳定。
  • 测试初始化时序存在漏洞:你将mockWebServer.dispatcher的赋值逻辑放在测试方法内部,晚于@Before中的MockWebServer启动步骤。如果Fragment初始化发起请求的时机早于dispatcher赋值完成,MockWebServer会直接返回默认404响应,请求瞬间结束,RecyclerView拿不到列表数据,点击操作必然失败。
  • 资源回收逻辑缺失:你在@After方法中只关闭了MockWebServer,没有将注册的IdlingResource从IdlingRegistry中注销。测试过程中创建的单例IdlingResource会跨测试用例泄漏,污染其他测试的运行状态,进一步放大不稳定问题。

对应修改方案

  • 补全IdlingResource的统计逻辑
    替换旧版OkHttp IdlingResource,实现对OkHttp待执行队列、执行中队列的全量统计,只要任意队列存在未完成的请求,就判定为非空闲状态。也可以直接在OkHttpClient的请求拦截器层做请求计数,完全跳过Dispatcher的队列状态判断,消除等待窗口的统计遗漏。
  • 调整测试初始化顺序
    将MockWebServer的dispatcher赋值逻辑移到@Before方法中,在启动MockWebServer之后立刻配置好响应规则,把MockWebServer的启动步骤放到Hilt依赖注入之前,保证请求发起时服务端、拦截链路全部处于就绪状态。
  • 完善测试资源回收
    在@After方法中增加IdlingResource的注销操作,同时清空OkHttpClient Dispatcher中的待执行、已执行请求队列,避免测试用例之间的状态残留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 04:45:02