我为什么要使用模拟对象(Java)?所有模拟框架都有同样的目的吗?

时间:2011-06-21 13:38:26

标签: java unit-testing mocking

  

可能重复:
  What is the purpose of mock objects?

我正在准备演示文稿,我需要更好地了解模拟是什么,使用它的目的是什么,我应该使用模拟对象的常见情况是什么?我发现那里有一堆mocking frameworks。他们都做同样的事情,还是使用特定的框架进行特定的测试?这些框架之间有什么区别?你会推荐哪一个用于测试Java?

这里有一些我发现的东西:

1. MockingToolkitComparisonMatrix似乎有偏见。

2. What are mock objects in Java?这是一岁。我想今天可能会有更好的答案。

谢谢。

3 个答案:

答案 0 :(得分:6)

模拟的目的是允许您单独测试应用程序组件。例如,如果您有一个使用DAO的服务,您希望能够在不必通过DAO转到数据库的情况下测试您的服务。你会

1)单独测试DAO,和 2)在服务测试中模拟DAO,以便可以单独测试您的服务。

由于您的DAO具有明确定义的API,因此您的模拟DAO会模拟该API。因此,如果您的服务调用了findAll类型方法,则可以轻松地模拟DAO以期望调用findAll并返回相应的结果。

所有模拟框架的目的都是相同的 - 允许您设置期望并断言在测试中满足这些期望。但是,框架之间的细节是不同的。我在实际工作环境中使用过EasyMock,并与Mockito一起玩回答关于SO的一些问题。两者都很不错。进入成本相当低 - 这个想法始终是设定期望,让模拟返回结果,然后验证期望是否得到满足。您可能需要花一两天的时间来理解您的模拟框架,但之后您应该能够高效工作并找出您不知道的内容。

答案 1 :(得分:5)

在良好的封装设计中,无论其依赖项的实现类如何,类的行为都应相同。 Mocking允许您隔离您的实现代码,以便您可以检查它将如何独立于更多不稳定的构造(如数据库和文件系统)以确保确定性结果的方式做出反应。

答案 2 :(得分:-1)

模拟框架也应该有助于定义在测试期间调用某个方法。

因此,如果您的测试没有调用指定的方法,那么模拟框架将指示这一点。或者您可以指定以特定顺序调用两个方法(打开/关闭,例如。)