返回
Mockito 中的“未完成的存根异常”:常见问题解答和最佳实践
java
2024-03-02 11:01:01
Mockito 中的“未完成的存根异常”:全面指南
什么是“未完成的存根异常”?
在使用 Mockito 进行测试时,"未完成的存根异常" 可能会让你头疼不已。它发生在当存根一个方法时没有明确指定返回值或抛出异常。这会让 Mockito 感到困惑,无法模拟对象的预期行为。
识别“未完成的存根”
堆栈跟踪中的 org.mockito.exceptions.misusing.UnfinishedStubbingException
是 "未完成的存根" 的一个明显标志。错误消息通常会指出缺少的信息,例如 thenReturn()
、thenThrow()
或 doThrow()
。
解决“未完成的存根异常”
要解决这个异常,你需要明确地为存根方法提供返回值或抛出异常。有以下几种方法可以做到这一点:
- 使用
thenReturn()
返回值:when(mock.method()).thenReturn(value);
- 使用
thenThrow()
抛出异常:when(mock.method()).thenThrow(exception);
- 使用
doThrow()
抛出异常:doThrow(exception).when(mock).method();
示例:
考虑这个例子:
@Test
public void myTest() {
MyMainModel mainModel = Mockito.mock(MyMainModel.class);
Mockito.when(mainModel.getList()).thenReturn(getSomeList()); // Line 355
}
在这个例子中,when(mainModel.getList())
存根没有提供返回值。要解决这个问题,我们需要使用 thenReturn()
提供一个值:
@Test
public void myTest() {
MyMainModel mainModel = Mockito.mock(MyMainModel.class);
Mockito.when(mainModel.getList()).thenReturn(Arrays.asList(new SomeModel()));
}
其他注意事项
- 避免存根最终方法: Mockito 无法存根最终方法,会导致 "未完成的存根异常"。
- 使用明确的存根: 不要依赖隐式存根,因为它们可能会导致意外的行为。
- 充分测试存根: 确保存根按预期工作非常重要。
常见问题解答
-
为什么我收到“未完成的存根异常”?
- 因为它没有明确指定存根方法的返回值或异常。
-
如何解决“未完成的存根异常”?
- 使用
thenReturn()
、thenThrow()
或doThrow()
提供返回值或抛出异常。
- 使用
-
为什么使用显式存根很重要?
- 隐式存根可能会导致意外的行为,难以调试。
-
如何避免“未完成的存根异常”?
- 在存根方法时始终提供返回值或抛出异常。
- 使用 Mockito 的
verify()
方法来验证存根的正确性。
-
Mockito 中 "未完成的存根异常" 的最佳实践是什么?
- 始终使用显式存根。
- 彻底测试存根。
- 避免存根最终方法。