一.Jmockit 的简介:(https://code.google.com/p/jmockit/)
JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来修改Java的Bytecode。正是由于基于instrument,可以修改字节码。所以这也是它强大的原因。
- Jmockit可以mock的种类包含:
- class(abstract, final, static) ;
- interface ;
- enum ;
- annotation ;
- native 。
Jmockit 有两种mock的方式:
-
Behavior-oriented(Expectations & Verifications) :
基于行为的mock,对mock目标代码的行为进行模仿,更像黑盒测试。 -
State-oriented(MockUp) :
基于状态的mock,站在目标测试代码内部的。可以对传入的参数进行检查、匹配,才返回某些结果,类似白盒。而State-oriented的 new MockUp基本上可以mock任何代码或逻辑。非常强大。
二.Mock 工具的原理:
mock工具工作的原理如下图:
- record 阶段:录制期望。数据准备阶段,创建依赖的class,interface,method,模拟返回的数据,及调用的次数等。
- replay阶段:通过调用被测的代码,执行测试。期间会invoke到第一阶段record的mock对象或者方法。
- verify阶段:验证。可验证调用返回是否正确,mock的方法调用次数、顺序等。
三.Mock的使用场景
如:
- mock:外部应用HSF service调用的依赖,如:TP,UIC的hsf服务依赖。
- mock:对DAO层的调用,如访问mysql、oracle,TFS等底层存储的调用
- mock:对系统间异步交互通知消息。
- mock:method A中涉及method B的调用,mock相应的method B。
- mock:对一些应用里面自己的class(抽象类abstract,final,静态类static),interface,annotation,enum,native等mock。
四.Jmockit的API及tools
可以看到jmockit常用的Expectation、NonStrictExpectations 期望录制 及Annotation @Tested、@Mocked,@NonStrict、@Injectable 等简洁的mock代码风格。而且jmockit 还自带了code coverage的工具供本地UT时候看逻辑覆盖或代码覆盖率使用。
五.Jmockit 的使用
第一步:环境配置–添加Jmockit的jar包依赖
使用jMockit首先要引用相关的jar包,在Maven pom.xml配置中引入jmockit的jar包,(可顺带引入jmockit自带的code coverage的jar),pom文件引用如下:
<!-- 先声明jmockit的依赖 -->
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.20</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit-coverage</artifactId>
<version>1.20</version>
<scope>test</scope>
</dependency>
<!-- 再声明junit的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
JUnit4.x及以下用户特别注意事项:
如果你是通过mvn test来运行你的测试程序 , 请确保JMockit的依赖定义出现在JUnit的依赖之前。
如果你还需要使用JMockit的代码覆盖率功能,在pom.xml中如下添加 :code coverage的jar
参考资料:
-
JMockit中文网:http://jmockit.cn/index.htm
我觉得如果仅仅是开发自测的话,把JMockit中文网认真看一遍,就可以在项目中使用JMockit了。 -
JMockit中文教程:https://www.jianshu.com/c/cfe7310a18ff
官方文档中文版。对于不喜欢看英语文档的人还是很不错的。这个教程比JMockit详细,文档嘛肯定更全面。