为何Mockito不允许按不同参数存根返回不同值?遇UnnecessaryStubbingException
Mockito存根不同参数方法抛出UnnecessaryStubbingException的原因
你的代码:
when(myServiceMock.mymethod("aaa", myEnum.ONE)).thenReturn(true); when(myServiceMock.mymethod("bbb", myEnum.ONE)).thenReturn(false);
抛出UnnecessaryStubbingException的核心原因是存在未被测试触发的存根定义。
Mockito的严格模式(默认启用)会检查所有存根的方法调用是否都在测试中被执行。如果你的测试用例只实际调用了其中一种参数组合(比如只调用了mymethod("aaa", myEnum.ONE),完全没用到"bbb"对应的存根),那这个没被触发的存根就会被判定为冗余,从而抛出异常。
另外需要排查小概率情况:如果字符串参数存在肉眼不易察觉的差异(比如前后空格、大小写不一致),或者该参数类型的equals方法被重写后匹配逻辑不符合预期,会导致存根无法被命中,进而被判定为多余。
常见解决方式
- 若某个存根本来就不需要,直接删除对应的存根代码;
- 补充测试逻辑,确保所有存根的方法调用都在测试中被触发;
- 关闭严格模式:可以给
@Mock注解添加参数strictness = Mock.Strictness.LENIENT,或者用Mockito.lenient().when(...)来定义允许冗余的存根。
内容的提问来源于stack exchange,提问作者dataman
相关产品推荐
相关产品推荐

