单元测试中如何让Spy实例的protected方法返回指定值?
解决Mockito Spy中protected方法Stub的空指针问题
- 结论:完全可以让
shouldSetFlag方法返回true,你的空指针异常是因为Stub方式错误导致触发了真实方法执行。
问题根源
你当前使用的when(myClass.shouldSetFlag(anyLong(), any(ObjectA.class), any(ObjectB.class))).thenReturn(true)会先调用真实的shouldSetFlag方法,再进行Stub。由于这是一个protected辅助方法,它可能依赖Spy实例中未初始化的内部状态(比如某些字段为null),从而抛出空指针异常。
正确的Stub方式
使用Mockito的doReturn语法,这种方式会直接跳过真实方法的调用,直接设置返回值:
doReturn(true).when(myClass).shouldSetFlag(anyLong(), any(ObjectA.class), any(ObjectB.class));
额外注意事项
- 确保测试类与目标类处于同一包路径,这样Mockito可以访问protected方法。如果包路径不同,可以通过反射临时修改方法的访问权限,或者使用Mockito的
Whitebox工具类辅助操作。 - 确认
anyLong()、any(ObjectA.class)等匹配器的导入正确(来自org.mockito.ArgumentMatchers),避免因导入错误导致的匹配失败。
内容的提问来源于stack exchange,提问作者Mary Sanderson
相关产品推荐
相关产品推荐

