我正在测试一个类并想在其中模拟一个方法调用:
class B{
method A();
String method C();
}
现在,我想测试 methodA
并模拟对 method 的调用C
,因为 methodC
从 URL 读取输入。如何使用 Mockito 做到这一点?
您在这里有很多选择。
可能是最简单的 - 您可以使用 mockito spy (http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#13),这是一个可以存根某些方法的对象,而其他人保留他们现有的行为。
或者,您可以使用模拟,然后使用静态 doCallRealMethod 方法的存根方法 A,将 when 与 thenCallRealMethod 结合使用。
但在我看来,最好的办法是重构您的类,以便从 URL 读取的部分位于单独的类中。然后为 B 类编写一个单元测试,对单独的类使用模拟。然后为从 URL 读取的类编写一个集成测试。
如果这种方法不清楚,请在此处发表评论;我会尝试详细说明。
实际上,当模拟一个对象(至少使用 mockito)时,你模拟了整个对象,而不使用一些不推荐的调用,这些调用都包含在他们的文档中:
像往常一样,您将阅读部分模拟警告:面向对象编程通过将复杂性划分为单独的、特定的 SRPy 对象来减少复杂性。部分模拟如何适应这种范式?好吧,它只是没有......部分模拟通常意味着复杂性已转移到同一对象上的不同方法。在大多数情况下,这不是您设计应用程序的方式。
所以可能有两种解决方案:
1 - 你重新设计你的类,使methodC在你的实际classB的一个聚合类中,之后你可以注入可以在测试的classB中完全模拟的新类。作为奖励,您可以更好地分离任务,因为所有外部世界交互都应该单独封装,以在外部源更改时帮助测试和维护它(但我不具体知道您的方法 A 和 C 做了什么)
2-在您的测试类中,您可以扩展 ClassB 并覆盖 methodC,这会导致一种手动模拟并且不需要任何模拟框架,但 mockito 部分警告仍然可以保留在这里。
希望这有帮助