本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用Mockito的Java示例.
在软件开发的世界之外, "mock"一词是指模仿或者效仿. 因此可以将“mock”理解为一个替身,替代者. 在软件开发中提及"mock",通常理解为模拟对象或者Fake.
译者注:mock等多代表的是对被模拟对象的抽象类,你可以把fake理解为mock的实例。不知道这样说准不准确:)
Fake通常被用作被测类的依赖关系的替代者.
名次定义 |
依赖关系 – 依赖关系是指在应用程序中一个类基于另一个类来执行其预定的功能.依赖关系通常都存在于所依赖的类的实例变量中. |
|
被测类 – 在编写单元测试的时候, “单元”一词通常代表一个单独的类及为其编写的测试代码. 被测类指的就是其中被测试的类. |
为什么需要模拟?
在我们一开始学编程时,我们所写的对象通常都是独立的. hello world之类的类并不依赖其他的类(System.out除外),也不会操作别的类.但实际上,软件中是充满依赖关系的.我们会基于service类写操作类,而service类又是基于数据访问类(DAOs)的,依次下去.
单元测试的思路就是我们想在不涉及依赖关系的情况下测试代码. 这种测试可以让你无视代码的依赖关系去测试代码的有效性.核心思想就是如果代码按设计正常工作,并且依赖关系也正常,那么他们应该会同时工作正常.
下面的代码就是这样的例子:
import java.util.ArrayList; public class Counter { public Counter() { } public int count(ArrayList items) { int results = 0; for(Object curItem : items) { results ++; } return results; } }
如你所见,上面的例子十分简单,但它阐明了要点.当你想要测试count方法时,你会针对count方法本身如何工作去写测试代码. 你不会去测试ArrayList是否正常工作,因为你默认它已经被测过并且工作正常.你唯一的目标就是测试对ArrayList的使用.
模拟对象的概念就是我们想要创建一个可以替代实际对象的对象.这个模拟对象要可以通过特定参数调用特定的方法,并且能返回预期结果.Stubbing就是告诉fake当与之交互时执行何种行为过程。通常它可以用来提供那些测试所需的公共属性(像getters和setters)和公共方法。
当谈到stubbing方法,通常你有一系列的选择。或许你希望返回一个特殊的值,抛出一个错误或者触发一个事件,此外,你可能希望指出方法被调用时的不同行为(即通过传递匹配的类型或者参数给方法)。
这咋一听起来工作量很大,但通常并非这样。许多mocking框架的一个重要功能就是你不需要提供stub 的实体方法,也不用在执行测试期间stub那些未被调用的方法或者未使用的属性。
设置预期
Fake的一个关键的特性就是当你用它进行模拟测试时你能够告诉它你预期的结果。例如,你可以要求一个特定的函数被准确的调用3次,或不被调用,或调用至少两次但不超过5次,或者需要满足特定类型的参数、特定值和以上任意的组合的调用。可能性是无穷的。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务