返回

Mockito 中的“未完成的存根异常”:常见问题解答和最佳实践

java

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 无法存根最终方法,会导致 "未完成的存根异常"。
  • 使用明确的存根: 不要依赖隐式存根,因为它们可能会导致意外的行为。
  • 充分测试存根: 确保存根按预期工作非常重要。

常见问题解答

  1. 为什么我收到“未完成的存根异常”?

    • 因为它没有明确指定存根方法的返回值或异常。
  2. 如何解决“未完成的存根异常”?

    • 使用 thenReturn()thenThrow()doThrow() 提供返回值或抛出异常。
  3. 为什么使用显式存根很重要?

    • 隐式存根可能会导致意外的行为,难以调试。
  4. 如何避免“未完成的存根异常”?

    • 在存根方法时始终提供返回值或抛出异常。
    • 使用 Mockito 的 verify() 方法来验证存根的正确性。
  5. Mockito 中 "未完成的存根异常" 的最佳实践是什么?

    • 始终使用显式存根。
    • 彻底测试存根。
    • 避免存根最终方法。