用例里 mock 了支付客户端,跑起来真实请求还是发到了测试环境,对方日志里能看到这次调用,本地却没有任何报错。乍看像缓存或者权限的锅,追下去往往不是。
@Mock PaymentClient client; @InjectMocks OrderService svc; verify(client, times(1)).pay(any());
追下去是这么回事:被测对象在构造时自己 new 了依赖,容器里的 mock 从头到尾没被用到,注入发生在对象创建之后,调用链拿到的仍是真实实例,顺序和时机都不对。
「mock 未生效」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
具体做法是,把依赖改成构造参数由用例传入;确认 mock 在对象创建之前完成注册;在 mock 上加一条调用次数断言。
验收就看一点,用例跑完 verify 通过,日志里不再出现对真实地址的请求。
