org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected. Clean & maintainable test code requires zero unnecessary code.
时间: 2025-07-15 19:44:21 浏览: 26
<think>好的,我现在要解决用户关于UnnecessaryStubbingException的问题。首先,我需要回忆一下Mockito框架的相关知识。这个异常通常出现在测试中,当存在不必要的存根(stub)时被抛出。用户提到异常信息指出检测到不必要的存根,说明测试中有多余的配置。
首先,我得解释这个异常的原因。Mockito在严格模式下运行,会检查那些被声明但从未在测试中被调用的存根方法。比如,如果使用Mockito的strict stubbing或者JUnit5中的MockitoExtension,或者手动调用了Mockito.validateMockitoUsage(),这些情况下Mockito会进行校验。
接下来,我需要给出解决方法。用户可能需要检查他们的测试代码,找到那些没有被实际调用的存根,然后删除它们。或者,如果他们确实需要这些存根,可能需要调整测试逻辑,确保它们被正确使用。另外,可以考虑关闭严格模式,但这不是推荐的做法,因为保持测试的严格性有助于维护代码质量。
然后,我需要给出示例代码,说明问题出现的场景以及如何修复。比如,一个测试中配置了mock对象的方法,但在测试中并没有调用该方法,这时候就会抛出异常。修改后的代码应该移除多余的存根,或者确保它们被正确调用。
最后,按照用户的要求,提出相关问题。这些问题可能涉及Mockito的其他异常、严格模式的使用、如何忽略不必要的存根,以及最佳实践等。确保问题与当前主题相关,帮助用户进一步理解Mockito的测试机制。</think><<
`UnnecessaryStubbingException` 是 Mockito 测试框架抛出的异常,表示测试中存在未被实际调用的冗余存根(stub)。该异常强调测试代码的简洁性,要求删除所有未被使用的模拟配置。
**原因**:
1. 在测试中定义了 mock 对象的方法存根(如 `when(...).thenReturn(...)`)
2. 该存根对应的模拟方法在后续测试中从未被实际调用
3. 使用 Mockito 的严格校验模式(通过 `MockitoRule.strictness(Strictness.STRICT_STUBS)` 或 `MockitoExtension`)
**解决方法**:
```java
// 错误示例:创建了未被使用的存根
@Test
public void testUnusedStub() {
List<String> mockList = Mockito.mock(List.class);
// 冗余存根(后续未调用)
when(mockList.get(0)).thenReturn("test");
// 实际测试逻辑未使用mockList.get(0)
mockList.add("item");
verify(mockList).add("item");
}
// 正确修改:
@Test
public void testCleanStub() {
List<String> mockList = Mockito.mock(List.class);
// 只保留必要的存根
when(mockList.add(anyString())).thenReturn(true);
mockList.add("item");
verify(mockList).add("item");
}
```
**处理方式选择**:
1. 删除冗余存根(推荐)
2. 使用 `lenient()` 放宽校验:
```java
@Test
public void testLenientStub() {
List<String> mockList = Mockito.mock(List.class);
lenient().when(mockList.get(0)).thenReturn("test");
mockList.add("item");
verify(mockList).add("item");
}
```
3. 调整测试结构确保存根被使用
4. 修改测试框架配置(慎用):
```java
@Rule
public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.LENIENT);
```
阅读全文
相关推荐



















