为什么我应该使用模拟对象(Java)?所有的模拟框架都有相同的作用吗?

3

可能有重复:
什么是模拟对象的目的?

我正在准备一个演示文稿,需要更好地了解模拟是什么,使用它的目的是什么,什么情况下应该使用模拟对象?我发现有很多 模拟框架。它们都做相同的事情吗,还是我要为特定的测试目的使用特定的框架?这些框架之间有什么区别?你会推荐哪个用于测试Java?

这里是我找到的一些东西:

1.模拟工具包比较矩阵,这似乎是有偏见的。

2.什么是Java中的模拟对象? 这已经一年了。我想今天可能会有更好的答案。

谢谢。

3个回答

6
模拟的目的是允许您独立测试应用程序组件。例如,如果您有一个使用DAO的服务,则希望能够在不通过DAO实际访问数据库的情况下测试该服务。您将会:
1) 独立测试DAO,并且
2) 在服务测试中模拟DAO,以使服务可以独立测试。
由于DAO具有明确定义的API,因此模拟DAO模拟该API。因此,如果您的服务调用了类似于findAll的方法,则可以轻松模拟DAO以期望调用findAll并返回适当的结果。
所有模拟框架的目的都是相同的——允许您设置期望并断言这些期望是否在测试中得到满足。然而,各个框架之间的细节是不同的。我曾在实际工作环境中使用过EasyMock,并在SO上回答一些问题时玩过Mockito。两者都非常好用。入门成本相当低——总的思路是设置期望值,让模拟对象返回结果,然后验证期望是否满足。您可能需要花一两天时间了解您的模拟框架,但之后,您应该能够做出产出并边工作边弥补自己的不足。

所以在任何依赖关系的情况下,我都应该使用模拟对象来隔离我正在测试的类。 - user793623
1
我推荐使用Mockito - 它的语法简洁,支持非严格验证,并且具有丰富的功能。 - Garrett Hall
@gnon,是的,从我看到的来看,Mockito非常不错。它是否支持模拟具体类而不仅仅是接口? - hvgotcodes
是的,但没有最终/静态的东西。为此有一个PowerMock版本。 - Garrett Hall

5
在一个良好的封装设计中,一个类应该无论其依赖项的实现类如何都能表现相同。模拟允许您隔离您的实现代码,这样您就可以检查它将如何反应,而不受数据库和文件系统等更易变构造的影响,以确保确定性结果。

我觉得你说话的方式就像一个TDD大师一样!措辞真是恰到好处! - asyncwait

-1
一个模拟框架应该也能帮助定义测试期间是否调用了特定的方法。
因此,如果您的测试没有调用指定的方法,则模拟框架将指示出来。或者,您可以指定以特定顺序调用两个方法(例如打开/关闭)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接