下单后立刻断言状态是 PAID,十次里三次还是 CREATED。有人在中间加了 sleep 3 秒,机器一忙又挂。乍看像缓存或者权限的锅,追下去往往不是。
await().atMost(Duration.ofSeconds(5))
.pollInterval(Duration.ofMillis(100))
.until(() -> orderRepo.findById(id).getStatus() == PAID);
追下去是这么回事:消息消费是异步的,固定等待时间买的是概率,不是顺序保证。机器负载一变,三秒就不够了。
碰到「异步断言等待」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
具体做法是,sleep 换成轮询 每 100 毫秒查一次 最多等五秒;轮询条件是状态到达或超时 超时抛带上下文的错;等待封装成工具方法 全项目统一;确认消费端没有批量延迟 否则调大间隔。
验收就看一点,连续跑三十次不再出现 CREATED 断言失败 单条用例耗时稳定在一秒内。
