ITestMock原理解析

1.   干什么用的

首先明确一点,ITestMock是一个【Mock管理框架】。顾名思义,我们先来解释一些这个名词中涉及的几个概念。

Mock:是一种通过创造难以复现或者缺失的真实对象的替代实例,来进行模拟测试的一种测试手段。它主要应用于隔离复杂的真实外部应用如网络、数据等以专注自身逻辑正确性的测试场景。

现在常用的Mock框架已经有不少比较成熟的mock框架如easymock、Mockito、jMockit等,它们有很多不同点,但是有一个共同点:需要手工管理mock对象的生命周期,从创建到录制动作,到将对象set到待测的位置。简而言之,他们都关注如何生成一个高效、适用性广的mock对象,而没有管理mock对象的其他生命周期。

有鉴于此,ITestMock以管理好mock对象的生命周期为目标,使用户只需要关注最贴近业务本身的录制动作,忽略其他的管理操作。

2.怎么用

参见http://kelude.taobao.net/faq/query_file.htm?typeId=13中的ITestMock用户手册。

3.怎么实现的

这个是本文的重点了。主要涉及四个主要的技术点,ITest框架与监听者模式、java元数据、cglib以及耳熟能详的反射。

ITestMock是ITest框架的一个组成部分,ITest的监听者模式保证了其良好的可扩展性;而ITestMock的mock生命周期管理可以分为目标定位、生成mock、mock注入以及mock清理,下面将按mock的生命周期来逐一讲解。

3.1  ITest框架与监听者模式

ITest框架是在junit4提供的可扩展的BlockJUnit4ClassRunner基础上,采用监听器模式扩展不同的上层辅助功能如基于spring的bean管理、基于dbunit的数据准备等功能。ITest的类结构如下图所示。

alt

采用监听器模式的ITest框架可以方便的利用新建监听器的方式扩展其他业务功能,如本文所述的mock功能。

3.2  Mock管理

mock的整个生命周期可以分为生成mock、注入mock、录制行为和执行以及mock的清理四大部分。其中生成mock的过程已经有许多mock框架很好地实现。这四个过程中用到的那些技术下面将逐一说明。

ITestMock的整个生命周期时序图如下所示。

alt

(1)   生成mock

如上图所示,在用例执行时,ITest框架会执行Mock监听器,从而启动mock的生命周期。

生成mock又可以分为获取mock参数、生成mock对象两个部分。

那如何获取待mock对象的相关参数,如class类、beanId等控制参数?此时java的元数据和反射机制就起作用了。

Java的元数据又称为java注释,即annotation。通过在目标类中声明annotation的方式,可以在类对应的class文件中留下定位信息。通过java反射机制来解析class文件,就能找到注释位置的属性、方法等等目标的位置,并可以进行修改等动态处理。

于此同时,通过beanId的方式,也可以从既有的spring的bean容器中获取待mock对象的实例。此时,应用扩展自Mockito框架的Mock类,即可以基于mock实例生成【部分mock】,也可以基于class文件生成全部mock对象——关于部分mock的定义可以参考mockito相关文档。

考虑到mockito生成mock对象的原理是基于cglib,而cglib生成代理对象有其局限性,如final类型的类不能mock。ITestMock后期可以扩展基于asm等更底层字节码修改工具的jmockit框架的支持。

(2)   注入mock

已经得到mock实例,对于普通用户而言,将现有真实对象批量替换为mock对象的操作是十分繁琐和易错的。

考虑到ApplicationContext中的bean对象默认是单例的这一特性,ITestMock利用反射机制,将mock动态注入spring中维护的单实例中;于此同时利用一个线程同步的ThreadLocal的Map变量来维护原本的真实对象,在本次test方法执行完毕以后替换回spring容器中。

同时,对于spring中非单例的情况,ITestMock也支持单独返回mock对象,由用户自行处理。

(3)   录制行为及执行

ITestMock的执行采用最精简的表达语法来表达,具体参考上文怎么用中介绍。

(4)   Mock清理

利用反射机制,将ThreadLocal中维护的真实对象替换回spring容器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值