用于模拟方法调用

时间:2012-07-05 22:54:29

标签: java mockito

我正在测试一个类,并希望在其中模拟一个方法调用:

class B{

  method A();

  String method C();

}

现在,我想测试方法A,并模拟对方法C的调用,因为方法C从URL读取输入。我怎么能用Mockito做到这一点?

2 个答案:

答案 0 :(得分:3)

这里有很多选择。

可能是最简单的 - 你可以使用一个模拟间谍(http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#13),这是一个你可以存根的对象方法,其他方法保留其现有行为。

或者,您可以使用模拟,然后使用静态doCallRealMethod方法使用stub方法A,当与thenCallRealMethod结合使用时。

但我认为最重要的是重构你的类,以便从URL读取的部分在一个单独的类中。然后为类B编写单元测试,使用模拟为单独的类。然后为从URL中读取的类编写集成测试。

如果此方法不明确,请在此发表评论;我会试着详细说明。

答案 1 :(得分:0)

实际上在模拟一个对象时(至少用mockito)你嘲笑整个对象而不使用一些未经推荐的调用,这些调用都在他们的doc中包含了这个:

  

像往常一样,您将阅读部分模拟警告:面向对象编程通过将复杂性划分为单独的特定SRPy对象来减少复杂性。部分模拟如何适应这种范式?好吧,它只是没有...部分模拟通常意味着复杂性已被移动到同一对象上的不同方法。在大多数情况下,这不是您想要设计应用程序的方式。

所以两种解决方案可能:

1 - 您重新设计了类,以便methodC位于实际classB的聚合类中,之后您可以注入可以在测试的classB中完全模拟的新类。作为奖励,您可以更好地分离任务,因为所有外部世界的交互都应该单独封装,以便在外部源更改时帮助测试和维护它(但我不知道您的方法A和C的具体用途)

在你的测试类中你可以扩展ClassB并覆盖方法C,这会产生一种手动模拟,并且不需要任何模拟框架,但模拟部分警告仍然可以保存在这里。

希望这个帮助