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