在 void 函数上使用 Mockito-thenCallRealMethod()

在尝试编写 JUnit 测试用例时,我遇到了一个问题,而且我对 Mockito 相对比较陌生。

我有一个我正在模仿的类的函数,这个函数恰好是一个 void 返回类型。当从我的模拟类调用这个函数时,我的理解(和调试经验)是它不调用原始函数。为了克服这个问题,我尝试使用“ then CallRealMethod ()”中的“ when”。

when(instance.voidFunction()).thenCallRealMethod();

“ voidFunction”充满了我不想触发的逻辑。为了避免这种情况,我将这些语句提取到 when 语句中。我曾经读到过我应该使用 doReturn().when().voidFunction()的格式,但是这样做并不能调用真正的方法。

我也理解我不能在这里使用间谍,因为我不希望在“ when”语句之前调用 voidFunction()。如果这是一个非常简单的解决方案,我道歉,因为我对仿声的理解不是很好,尽管读了很多。谢谢!

45654 次浏览

when语法不适用于 void 方法(它不适用于 when) ,当没有返回值时,doReturn也不适用。doCallRealMethod可能是你想要的答案。

doCallRealMethod().when(instance).voidFunction();

请记住,在调用模拟的实际方法时,您可能得不到非常现实的行为,因为与间谍不同,模拟对象将跳过所有构造函数和初始化器调用,包括那些用于设置字段的调用。这意味着,如果您的方法使用任何实例状态,它就不太可能作为模拟 doCallRealMethodthenCallRealMethod。使用间谍,您可以创建类的真实实例,然后 Mockito.spy方法将复制该实例状态,以实现更真实的交互。