登录态自动刷新异步队列测试需验证:token过期时暂停请求、单次刷新后按序重放且不重复不丢失;通过mock控制401/refresh响应,用promise.allsettled和fetch.mock.calls校验顺序;覆盖刷新失败、新token无效、刷新中新增请求等边界;依赖微任务清空而非定时器,确保队列单例共享。

登录态自动刷新异步队列的测试,核心是验证:当请求因 token 过期被拦截时,系统能否暂停后续请求、先刷新 token、再按原顺序重放所有待处理请求,且不重复执行、不丢失、不乱序。
模拟 token 过期与刷新接口
用 jest.mock 或 msw 拦截请求,控制响应行为:
- 首次调用任意受保护接口(如
/user/profile)返回401,模拟 token 失效 - 对
/auth/refresh接口固定返回新 token 和有效期(如 3600 秒) - 后续重放请求应全部成功(返回
200),且请求头中Authorization已更新
构造并发请求并观察执行顺序
在测试中同时发起多个依赖登录态的请求(如 3–5 个),确保它们进入等待队列而非直接失败:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Promise.allSettled([...])收集所有请求结果,检查是否全部 fulfilled - 通过 mock 的请求记录(如
fetch.mock.calls)验证调用顺序:
→ 先发全部原始请求 → 触发一次 refresh → 再按原顺序重发全部请求 - 特别检查是否有“重复刷新”(多次调用
/auth/refresh)或“跳过重放”(某个请求没重试)
验证队列状态与错误边界
测试异常场景,确认队列逻辑健壮:
-
刷新失败时:mock
/auth/refresh返回401或网络错误,检查所有待处理请求是否 reject 并带上清晰错误(如RefreshTokenExpiredError) - 刷新成功但新 token 仍无效:refresh 返回 200 但后续请求仍 401,应避免无限循环(比如限制最大重试次数为 1)
- 刷新中新增请求:在 refresh 请求发出后、完成前再发一个新请求,它应自动加入等待队列,而不是立即失败
使用真实 Promise 链验证时序(不依赖定时器)
避免用 setTimeout 等不可靠方式等待,改用:
- 监听 refresh 请求 resolve 后,再断言重放请求是否已发出
- 用
await Promise.resolve()或await flushPromises()(自定义工具函数)清空微任务队列,确保队列调度已完成 - 对每个请求包装成带标记的 promise(如
requestA.then(() => 'A done')),最后检查 resolve 顺序是否符合预期
不复杂但容易忽略的是:队列必须是单例、共享且线程安全(JS 单线程下主要防重复初始化),测试前确保清理全局状态(如清空 mock、重置 token 存储)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










