JUnit中Mockito不必要存根异常(UnnecessaryStubbingException)求助
解决Mockito UnnecessaryStubbingException异常
异常原因
UnnecessaryStubbingException 是因为你定义了存根(stub)方法,但测试代码中没有实际调用这些存根对应的方法。Mockito默认的严格模式会检查所有存根是否都被使用,未被调用的存根会被判定为冗余,触发这个异常。
你的测试代码存在两个核心问题:
- 没有调用被测试的目标方法
checkForValidFormIdForCoverageTest(),导致你存根的getCarirSysID()和dsBean.getStateInfo()都没有被触发。 - 可能存在多余存根:如果
dsBean.getStateInfo()并不是checkForValidFormIdForCoverageTest()方法依赖的逻辑,这个存根本身就是冗余的。
解决方案
1. 调用被测试的目标方法
测试的核心是执行被测试方法,触发依赖的存根逻辑。在测试代码末尾添加对目标方法的调用:
@Test public void checkForValidFormIdForCoverageTest() throws Exception{ String caseId="caseId"; StateVO stateVO = new StateVO(); stateVO.setDeliveryState("AK"); // 仅当被测试方法确实需要调用dsBean.getStateInfo时才保留这个存根 Mockito.when(dsBean.getStateInfo(any())).thenReturn(stateVO); String carirSysID="CarirSysID"; ApplicationCovrgeCommonRules applicationCovrgeCommonRulesMock= Mockito.spy(applicationCovrgeCommonRules); Mockito.doReturn(carirSysID).when(applicationCovrgeCommonRulesMock).getCarirSysID(caseId); // 执行被测试方法,触发存根调用 applicationCovrgeCommonRulesMock.checkForValidFormIdForCoverageTest(caseId); // 可选:添加断言验证方法执行结果(根据方法返回值或副作用调整) // 例如如果方法返回布尔值: // boolean result = applicationCovrgeCommonRulesMock.checkForValidFormIdForCoverageTest(caseId); // Assertions.assertTrue(result); }
2. 清理多余的存根
检查 dsBean.getStateInfo() 是否真的被 checkForValidFormIdForCoverageTest() 方法调用。如果没有,直接删除这个存根代码,避免冗余。
3. 临时启用宽松模式(不推荐)
如果确实需要保留未被调用的存根,可以通过以下方式关闭严格检查:
- 在测试类上添加注解:
@MockitoSettings(strictness = Strictness.LENIENT) public class YourTestClass { // 测试方法 } - 针对单个存根使用宽松模式:
Mockito.lenient().when(dsBean.getStateInfo(any())).thenReturn(stateVO);
注意:宽松模式会降低测试的严谨性,可能隐藏测试逻辑中的问题,仅作为临时方案使用。
内容的提问来源于stack exchange,提问作者Raushan
相关产品推荐
相关产品推荐

