unit-testing - Mockito - thenCallRealMethod() 在 void 函数上

标签 unit-testing junit mocking mockito void

我在尝试编写 JUnit 测试用例时遇到了一个问题,我对 Mockito 比较陌生。
我有一个我正在模拟的类的函数,这个函数恰好是一个 void 返回类型。当从我的模拟类调用这个函数时,我的理解(和调试经验)它不调用原始函数。为了克服这个问题,我尝试将“when”与“thenCallRealMethod()”结合使用。

when(instance.voidFunction()).thenCallRealMethod();
“voidFunction”充满了我不想触发的逻辑。我已将这些提取到 when 语句中以避免这种情况。我读过我应该使用 doReturn().when().voidFunction() 的格式,但是这样做并不会调用真正的方法。
这也是我的理解,我不能在这里使用 spy ,因为我不想要 voidFunction()在“when”语句之前调用。感谢任何帮助,如果这是一个非常简单的解决方案,我深表歉意,因为尽管阅读了很多书,但我对 mockito 的理解并不是很好。谢谢!

最佳答案

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

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

请记住,当在模拟上调用真正的方法时,您可能不会得到非常现实的行为,因为与 spy 不同,模拟对象将跳过所有构造函数和初始化程序调用,包括设置字段的调用。这意味着,如果您的方法根本使用任何实例状态,则不太可能用作 doCallRealMethod 的模拟。或 thenCallRealMethod .使用 spy ,您可以创建类的真实实例,然后是 Mockito.spy方法将复制该实例状态以进行更真实的交互。

关于unit-testing - Mockito - thenCallRealMethod() 在 void 函数上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39881717/

相关文章:

java - 模拟单元测试用例的网络响应

unit-testing - Visual Studio 2013 无法打开测试窗口

.net - 模拟上的所有调用都必须具有相应的设置

angularjs - Jasmine 测试 : How to mock a method inside a controller in AngularJS

unit-testing - 如何从我的单元测试中触发 Quartz Cronjob

java - 在 @After 方法中检测 Junit 测试的失败或错误

grails - Grails:如何检查是否已将经过字段验证的字段添加到其他Domain类?

java - 使用模拟方法参数来模拟后续步骤

python - 尝试模拟模块时出现 ImportError

mocking - spock:这个 mock 有什么问题吗