在近的r应用的单元测试中,经常需要用到mock,可以说mock在ut (unit test)中是无处不在的。而在r的ut实践中也找到了一种很简洁的mock方式,不仅解决了ut中所有需要mock的地方,而且可以很少量的代码来完成mock。详见下文。

  一.Mock的使用场景:

  比如以下场景:

  1. mock掉外部依赖的应用的HSF service的调用,比如uic,tp 的hsf服务依赖。

  2. 对DAO层(访问mysql、oracle、tair、tfs等底层存储)的调用mock等。

  3. 对系统间异步交互notify消息的mock。

  4. 对method_A里面调用到的method_B 的mock 。

  5. 对一些应用里面自己的 class(abstract, final, static),interface,annotation ,enum,native等的mock。

  二. Mock工具的原理:

  mock工具工作的原理大都如下:

  1. record阶段:录制期望。也可以理解为数据准备阶段。创建依赖的class 或interface或method ,模拟返回的数据,及调用的次数等。

  2. replay阶段:通过调用被测代码,执行测试。期间会invoke 到 第一阶段record的mock对象或方法。

  3. verify阶段:验证。可以验证调用返回是否正确。及mock的方法调用次数,顺序等。

  三. 当前的一些Mock工具的比较:

  历史曾经或当前比较流行的Mock工具有EasyMock、jMock、Mockito、Unitils Mock、PowerMock、jmockit等工具。

  他们的功能对比如下:

  从这里可以看到,当前为什么jmockit为什么这么火爆了!所以我们的UT中的mock工具也选择了目前无所不能的jmockit。

  而在使用的过程中,感觉到jmockit的 Auto-injection of mocks 及 Special fields for "any" argument matching  及各种有用的 Annotation 给测试代码精简和测试效率提升带来了实实在在的好处。