@Mock private PriceRepository repo; @InjectMocks private PriceService service; // 不要 @Mock private PriceService service;
为了绕开依赖,把 PriceService 整个 @Mock 掉,用例全绿,覆盖率也好看。可里面的折扣计算一行都没执行。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,mock 替换的是整个对象,调用直接返回桩值,真实实现被跳过。用例验证的是桩,不是代码。
「mock 被测方法」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
处理上按这个顺序:只 mock 它依赖的仓储和客户端 被测类保持真实;必须替换部分方法就用 spy 并显式调用真实实现;用覆盖率确认被测方法内部行被执行;检查断言是否只验证了桩的返回值。
改完只确认一件事:被测类的折扣分支出现在覆盖率报告里 改动实现能让用例失败。
