@Mock private PriceRepository repo;
@InjectMocks private PriceService service;
// 不要 @Mock private PriceService service;

为了绕开依赖,把 PriceService 整个 @Mock 掉,用例全绿,覆盖率也好看。可里面的折扣计算一行都没执行。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,mock 替换的是整个对象,调用直接返回桩值,真实实现被跳过。用例验证的是桩,不是代码。

「mock 被测方法」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

处理上按这个顺序:只 mock 它依赖的仓储和客户端 被测类保持真实;必须替换部分方法就用 spy 并显式调用真实实现;用覆盖率确认被测方法内部行被执行;检查断言是否只验证了桩的返回值。

改完只确认一件事:被测类的折扣分支出现在覆盖率报告里 改动实现能让用例失败。

作者 9823189