07.mock测试

Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以方便测试的测试方法。

它的主要作用是把测试与测试边界以外的对象隔离开。例如:当系统需要调用第三方API的时候,因为第三方API还没开发完,或者无法开放连接的时候,我们可以使用Mock方法模型出API调用函数返回,完成测试。

Mock是单元测试中常见的一种技术,编写自定义的Mock对象需要额外的编码工作,同时也可能引入错误。Mock对象能够模拟其它协同模块的行为,被测试模块通过与Mock对象协作,可以获得一个孤立的测试环境。

目前,有许多开源项目对动态构建 Mock 对象提供了支持,这些项目能够根据现有的接口或类动态生成,这样不仅能避免额外的编码工作,同时也降低了引入错误的可能。

Mock工具的原理

mock工具工作的原理一般如下:

  1. record阶段:录制期望。也可以理解为数据准备阶段。创建依赖的class或interface或method,模拟返回的数据,及调用的次数等。
  2. replay阶段:通过调用被测代码,执行测试。期间会invoke到第一阶段record的mock对象或方法。
  3. verify阶段:验证。可以验证调用返回是否正确。及mock的方法调用次数,顺序等。

Java常见的Mock Toolkit

EasyMock

EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。

EasyMock官方网站

Jmock

JMock是帮助创建mock对象的工具,它基于Java开发,在Java测试与开发环境中有不可比拟的优势,更重要的是,它大大简化了虚拟对象的使用。

Jmock官方网站

PowerMock

PowerMock是一个扩展了其它如EasyMock等mock框架的、功能更加强大的框架。PowerMock使用一个自定义类加载器和字节码操作来模拟静态方法,构造函数,final类和方法,私有方法,去除静态初始化器等等。通过使用自定义的类加载器,简化采用的IDE或持续集成服务器不需要做任何改变。熟悉PowerMock支持的mock框架的开发人员会发现PowerMock很容易使用,因为对于静态方法和构造器来说,整个的期望API是一样的。PowerMock旨在用少量的方法和注解扩展现有的API来实现额外的功能。

PowerMock官方网站

Mockito

Mockito是一个流行的Mocking框架。它使用起来简单,学习成本很低,而且具有非常简洁的API,测试代码的可读性很高。因此它十分受欢迎,用户群越来越多,很多的开源的软件也选择了Mockito。

Mockito官方网站

Jmockit

JMockit是一个能帮我们解决以上问题的轻量级框架,他允许你动态的改变已有的方法,这主要基于java 1.5的Instrumentation框架,这样便可以使得JMockit能够适应几乎所有的设计。他允许你重定义private,static and final方法,甚至是no-arg constructors都能够并轻易的重定义。

Jmockit官方网站