您的位置:首页 > 其它

单测mock和stub

2014-12-17 15:23 375 查看
A variety of different terms are used to refer to these “custom objects”. In an effort to clarify the vocabulary,

Gerard Meszaros provides the following definitions:

● Test Double is a generic term for any test object that replaces a production object.

● Dummy objects are passed around but not actually used. They are usually fillers for parameter lists.

● Fakes have working implementations, but take some shortcut (e.g., InMemoryDatabase).

● Stubs provide canned answers to calls made during a test.

● Mocks have expectations which form a specification of the calls they do and do not receive.

(1) Dummy
对象被四处传递,但是从不被真正使用。通常他们只是用来填充参数列表。

(2) Fake
有实际可工作的实现,但是通常有一些缺点导致不适合用于产品(基于内存的数据库就是一个好例子)。

(3) Stubs

在测试过程中产生的调用提供预备好的应答,通常不应答计划之外的任何事。stubs可能记录关于调用的信息,比如 邮件网关的stub 会记录它发送的消息,或者可能仅仅是发送了多少信息。

(4) Mocks

如我们在这里说的那样:预先计划好的对象,带有各种期待,他们组成了一个关于他们期待接受的调用的详细说明。

stub是state-based,关注的是输入和输出。mock是interaction-based,关注的是交互过程。

stub也是可以通过增加代码来实现一些expectiation的特性,stub理论上也是可以向mock的方向做转化,而从使得两者的界限更加的模糊。

mock和stub的最重要的区别:expectiation/期望。

对于mock来说,exception是重中之重:我们期待方法有没有被调用,期待适当的参数,期待调用的次数,甚至期待多个mock之间的调用顺序。所有的一切期待都是事先准备好,在测试过程中和测试结束后验证是否和预期的一致。

而对于stub,通常都不会关注exception,就像上面给出的UserDaoStub的例子,没有任何代码来帮助判断这个stub类是否被调用。虽然理论上某些stub实现也可以通过自己编码的方式增加对expectiation的内容,比如增加一个计数器,每次调用+1之类,但是实际上极少这样做。

EasyMock使用了 record/replay的隐喻( metaphor)来设置expectations。对于每个你想要mock的对象,你建立一个control和mock对象。mock满足次要对象的接口,control可以提供额外的特性。为了说明一个 expectation,你调用了方法(带有期望的参数)。如果你需要一个返回值的话,接下来就调用control。一旦你结束了对 expectations的设置,你对control调用replay,那就是mock结束了记录而且准备好对主要对象做反应的时候。结束以后你对control调用verify。

人们最初一般会对record/replay隐喻有疑虑,但是很快会适应。它相比jMock的限制来说有优势,因为你可以实际调用方法,而不是利用string来制定方法的名字。这意味着你可以利用IDE提供的code-completion,而且任何对方法名的重构都会自动将test更新。缺点就是你不能拥有更松散的约束。

引入前驱者系列博文:http://www.blogjava.net/aoxj/category/29496.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: