mockito、easymock、powermock使用(1)-介绍

什么是Mock?

在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象。程序员通常创造模拟对象来测试其他对象的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为。

为什么要使用Mock?

在单元测试中,模拟对象可以模拟复杂的、真实的(非模拟)对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。

在下面的情形,可能需要使用模拟对象来代替真实对象:

  • 真实对象的行为是不确定的(例如,当前的时间或当前的温度);
  • 真实对象很难搭建起来;
  • 真实对象的行为很难触发(例如,网络错误);
  • 真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化);
  • 真实的对象是用户界面,或包括用户界面在内;
  • 真实的对象使用了回调机制;
  • 真实对象可能还不存在;
  • 真实对象可能包含不能用作测试(而不是为实际工作)的信息和方法。

Mockito和EasyMock

都可以极大地简化单元测试的过程,而被许多人应用在自己的工作中,但是这两种 Mock 工具都不可以实现对静态函数、构造函数、私有函数、Final 函数以及系统函数的模拟,但是这些方法往往是我们在大型系统中必不可少的功能,所以需要PowerMock来实现对静态函数、构造函数、私有函数、Final 函数以及系统函数的模拟。

Mockito和EasyMock可模拟以下场景:

  1. 模拟对象
  2. 模拟方法调用的返回值
  3. 模拟方法调用抛出异常
  4. 模拟调用方法时的参数匹配
  5. 模拟方法调用次数
  6. 校验行为
  7. 模拟方法调用
  8. 参数匹配
  9. 校验方法调用次数
  10. 模拟无返回方法抛出异常
  11. 校验方法调用顺序
  12. 校验方法是否从未调用
  13. 快速创建Mock对象
  14. 自定义返回不同结果
  15. 对返回结果进行拦截

PowerMock

PowerMock使用一个自定义类加载器和字节码操作来模拟静态方法,构造函数,final类和方法,私有方法,去除静态初始化器等等。通过使用自定义的类加载器,简化采用的IDE或持续集成服务器不需要做任何改变。

1.PowerMock支持EasyMock和Mockito。 
2.PowerMock支持JUnit和TestNG。
3.PowerMock能够完美的弥补Mockito的不足,能mock静态、final、私有方法等。而。

PowerMock有两个重要的注解:
  @RunWith(PowerMockRunner.class)
  @PrepareForTest( { YourClass.class })  
     当需要使用PowerMock强大功能(Mock静态、final、私有方法等)的时候,就需要加注解@PrepareForTest。 
     @InjectMocks:创建一个实例,用@Mock或@Spy注解创建的mock将被注入到该实例中。
  @Mock:创建一个mock,该对象所有的方法被置空,即都不是真实的方法。
  @Spy:创建一个mock对象,@Spy修饰的对象必须先手动new出来,但是,该对象所有方法都是真实方法,返回值都是和真实方法一样的。

PowerMock实现原理

1.当某个测试方法被注解@PrepareForTest标注以后,在运行测试用例时,会创建一个新的org.powermock.core.classloader.MockClassLoader实例,然后加载该测试用例使用到的类(系统类除外)。
2.PowerMock会根据你的mock要求,去修改写在注解@PrepareForTest里的class文件(当前测试类会自动加入注解中),以满足特殊的mock需求。例如:去除final方法的final标识,在静态方法的最前面加入自己的虚拟实现等。
3.如果需要mock的是系统类的final方法和静态方法,PowerMock不会直接修改系统类的class文件,而是修改调用系统类的class文件,以满足mock需求。

你可能感兴趣的:(代码质量)