Mockito - thenCallRealMethod()在void函数上的应用

93

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

我正在mock一个类的函数,而这个函数的返回类型恰好是void。当从我的mock类中调用该函数时,据我理解(和调试经验),它不会调用原始函数。为了克服这个问题,我尝试使用"when"和"thenCallRealMethod()"。

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

“voidFunction”充满了我不想触发的逻辑。我已经提取出这些内容到“when”语句中以避免这种情况。我阅读到应该使用 doReturn().when().voidFunction() 格式,然而这样做不会调用真实方法。

据我所知,在这里我不能使用Spy,因为我不希望在“when”语句之前调用“voidFunction()”。任何帮助都将不胜感激。如果这是一个非常简单的解决方案,我很抱歉,因为尽管阅读了很多,但我对mockito的理解并不是很好。谢谢!


2
我的回答解释了为什么我认为使用 do/when 的方式比 when/then 更好。如果你正在学习 Mockito,那么现在就是阅读它的时候了。 - Dawood ibn Kareem
1
谢谢,这真的很有帮助。我一直在学习/基于我们遗留代码库中已经存在的文件来创建测试文件,并且已经看到了两种方式,但是在遇到when/then两次的缺点之后,我同意你的建议。 - CRDamico
2
你应该认真考虑,不要让未来的读者对语法感到困惑。 - Jeff Bowman
1个回答

140

when语法无法与空方法一起使用(它无法适用于when中),而在没有返回值时doReturn不适用。 doCallRealMethod很可能是您想要的答案。

doCallRealMethod().when(instance).voidFunction();
请注意,当在 mock 对象上调用真实方法时,可能不会得到非常逼真的行为,因为与 spy 不同,mocked 对象将跳过所有构造函数和初始化器调用,包括那些设置字段的调用。这意味着,如果您的方法使用任何实例状态,使用 doCallRealMethodthenCallRealMethod 作为 mock 的方式工作的可能性很小。通过使用 spy,您可以创建一个类的真实实例,然后 Mockito.spy 方法将复制该实例状态,以实现更加逼真的交互。

5
谢谢,这正是我需要的,我特意寻找了那种方法但找不到。看起来它正在发挥作用! - CRDamico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接