单测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
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
相关文章推荐
- Dummy,Fake,Stub和Mock
- 初识stub和mock--junit的两种测试策略
- Stub和Mock的区别
- TDD学习笔记【六】一Unit Test - Stub, Mock, Fake 简介
- stub 和 mock 有什么区别
- 30天快速上手 TDD Day 7 - Unit Test - Stub, Mock, Fake 簡介
- 置换测试: Mock, Stub 和其他
- 软件测试中Mock和Stub
- RhinoMocks : Stub和Mock的区别
- What's the difference between a stub and mock?
- org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue
- TDD之Dummy Stub Fake Mock
- [转]软件测试- 3 - Mock 和Stub的区别
- iOS测试——置换测试: Mock, Stub 和其他
- 软件测试——Stub和Mock
- Mock 和Stub之间的区别
- 置换测试: Mock, Stub 和其他
- 单元测试之Stub和Mock
- stub与mock的区别
- TDD:什么是桩(stub)和模拟(mock)?