- 浏览: 209762 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (391)
- java (18)
- python (3)
- ruby (4)
- linux (48)
- 网络 (9)
- 前端 (2)
- 社会、文化、哲学、人生、百态 (0)
- 工具 (10)
- 下载 (0)
- 常用地址 (0)
- tracert (0)
- mysql (8)
- 开源相关收藏 (1)
- 模块查看依懒 (1)
- watch使用 (1)
- Tcpdump (2)
- easy_install安装 (1)
- 构造redis批量删除脚本 (1)
- MYSQL 性能测试 (1)
- JAVA code encode utf-8 (1)
- linux nginx awk 实时 每妙 (1)
- mkpasswd (1)
- spring security oauth (1)
- jmap dump java memory Analyzer (1)
- JAVA DUMP (1)
- swap linux 过高 解决 (1)
- SWAP (1)
- jmap jstat jstack dump (1)
- java jconsole 的使用 (1)
- git 常用 (1)
- MYSQL 索引 动态 唯一 (1)
- TCP 三次握手 四次挥手 (1)
- linux date (1)
- 删除 空行 注释行 (1)
- maven3 yum linux install repository (1)
- linux git 搭建 (1)
- linux sar eth1 查看 流量 (1)
- sar (1)
- netstat ip 过滤 常用脚本 (1)
- Tcpdump 包分析网络连接过程 (1)
- net ipv4 tcp time wait tw recycle (0)
- /etc/sysctl.conf linux 网络 配置 (1)
- ss 网络连接查看 (比netstat 快很多,实时性牺牲) (1)
- MYSQL 关键字 (1)
- Linux 下多核CPU知识 (1)
- top (1)
- 令牌 证书 (1)
- mysql unix timestamp (1)
- 端口扫描 nc nmap (1)
- 204 http code 状态码 (1)
- ss -s ss -l (1)
- linux 常用 curl (1)
- linux sed 替换 换行 (1)
- centos yum install rpm install (1)
- spring-mvc源码解读 (1)
- 使用iftop查看实时的网络流量 (0)
- linux 命令 expect (1)
- HTTP (1)
- openssl ddif 加密 (1)
- iptables 详解 (1)
- python 虚拟化 VirtualEnv virtualenvwrapper (1)
- nginx (2)
- more less 实用技巧 (1)
- linux nginx (2)
- linux curl https ssl 证书 ca (1)
- openssl (1)
- php mysql linux (1)
- linux 虚拟机 虚拟 xen (0)
- linux 虚拟机 虚拟 xen kvm (1)
- linux perl 单行执行技巧 (1)
- mysql 查看库占用空间 表查用空间 (1)
- linux tcpdump (1)
- maven (1)
- sun.misc.Unsafe (1)
- OpenSSL生成证书 (1)
- http://blog.csdn.net/zzulp/article/details/8018751 (1)
- maven 本地 jar dependency (1)
- 计算JAVA代码行数最简单命令 sed (1)
- 常用的证书格式转换 rsa eg (1)
- 加密 解密 签名 (1)
- 分析jar包冲突 (1)
- 使用JMockit编写java单元测试 (1)
- Linux 技巧:让进程在后台可靠运行的几种方法 (1)
- 环境变量控制 (1)
- 5+ 个 tar 命令的用法,附示例 (1)
- scp自动输入密码 (1)
- ps axo pid (1)
- ppid (1)
- comm (1)
- pmem (1)
- lstart|grep mysql (0)
- lstart (1)
- etime|grep mysql (1)
- UML类图字少好理解 (1)
- HTTP经典文章 (1)
- git (1)
- Git常用命令 (1)
- LINUX 系统被攻击的分析过程 (1)
- NIO (1)
- LINUX 操作快捷键使用 (1)
- openSSL命令、PKI、CA、SSL证书原理 (1)
- shell (2)
- 转载 (1)
- mysqldump 可以直接dump->xml (1)
- VIM比较全面的文章 (1)
- eclipse regex 正则表达式 (1)
- synchronized (1)
- 锁 (1)
- java 正则表达式 regex (1)
- Reference Queue 引用 源码 (1)
- spring aop 源码 分析 (1)
- java @Cache @Transaction 注解 (1)
- spring aop (1)
- spring jdk proxy cglib 动态代理 性能比较 (1)
- spring proxy private public 代理限制 (1)
- spring transaction aop 事务 (1)
- spring autowire 注解注入 (1)
- 桥接 NAT NAT地址转换 内部网络 虚拟网络 (1)
- spring-web-mvc 源码解读 之 RequestMappingHandlerMapping (1)
- find atime mtime ctime -n n +n (1)
- android studio 快捷键初探 (1)
- android 源码阅读的计划 (1)
- 计算机网络学习-VLAN (1)
- sed 高级 合并行 (1)
- CAP 一致性 可用性 分布式容错性 (1)
- android lib so 库文件 (0)
- android lib so 库文件 移植 (1)
- android 不错的博文 (1)
- sourceinsight 源码 阅读 (1)
- Android Tab UI (1)
- 诗 (1)
- mysql 批处理 (0)
- netty 堆外内存 DirectByteBuffer (1)
- netty 并发 百万 推送 (1)
- Linux操作系统中内存buffer和cache的区别 (1)
- maven intellij target bytecode version (1)
- linux sleep()的实现原理 (1)
- android (2)
- javadoc 代码注释规范 (1)
- spring 自动注入bean auto (1)
- Photoshop CS6常用快捷键 (1)
- 股票 数据 机器 分析 (1)
- 批处理 (1)
- mysql -e (1)
- char (1)
- Unicode (1)
- 编码 (1)
- utf8 (1)
- utf-8 (1)
- utf16 (1)
- utf-16 (1)
- IntelliJ IDEA (1)
- ide (1)
- idea (1)
- intellij (1)
- 文件 (1)
- 目录 (1)
- 源代码 (1)
- CountDownLatch (1)
- CyclicBarrier (1)
- Semaphore (1)
- spring (1)
- linux 查看不同进制文件 (1)
- WebMvcConfigurationSupport (1)
- sdkman工具的使用 (1)
- http header (1)
- LINUX系统优化 (1)
最新评论
-
gelongmei:
威武我大酒神
shell脚本不换行刷新数据
使用JMockit编写java单元测试
http://blog.csdn.net/chjttony/article/details/17838693
之前《有效使用Mock编写java单元测试》一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具——JMockit。
引用单元测试中mock的使用及mock神器jmockit实践中的java单元测试中各种Mock框架对比,就能明白JMockit有多么强大:
JMockit是基于JavaSE5中的java.lang.instrument包开发,内部使用ASM库来动态修改java的字节码,使得java这种静态语言可以想动态脚本语言一样动态设置被Mock对象私有属性,模拟静态、私有方法行为等等,对于手机开发,嵌入式开发等要求代码尽量简洁的情况下,或者对于被测试代码不想做任何修改的前提下,使用JMockit可以轻松搞定很多测试场景。
通过如下方式在maven中添加JMockit的相关依赖:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
<dependency>
<groupId>com.googlecode.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.googlecode.jmockit</groupId>
<artifactId>jmockit-coverage</artifactId>
<version>0.999.24</version>
<scope>test</scope>
</dependency>
JMockit有两种Mock方式:基于行为的Mock方式和基于状态的Mock方式:
引用单元测试中mock的使用及mock神器jmockit实践中JMockit API和工具如下:
(1).基于行为的Mock方式:
非常类似与EasyMock和PowerMock的工作原理,基本步骤为:
1.录制方法预期行为。
2.真实调用。
3.验证录制的行为被调用。
通过一个简单的例子来介绍JMockit的基本流程:
要Mock测试的方法如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class MyObject {
public String hello(String name){
return "Hello " + name;
}
}
使用JMockit编写的单元测试如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Mocked //用@Mocked标注的对象,不需要赋值,jmockit自动mock
MyObject obj;
@Test
public void testHello() {
new NonStrictExpectations() {//录制预期模拟行为
{
obj.hello("Zhangsan");
returns("Hello Zhangsan");
//也可以使用:result = "Hello Zhangsan";
}
};
assertEquals("Hello Zhangsan", obj.hello("Zhangsan"));//调用测试方法
new Verifications() {//验证预期Mock行为被调用
{
obj.hello("Hello Zhangsan");
times = 1;
}
};
}
JMockit也可以分类为非局部模拟与局部模拟,区分在于Expectations块是否有参数,有参数的是局部模拟,反之是非局部模拟。
而Expectations块一般由Expectations类和NonStrictExpectations类定义,类似于EasyMock和PowerMock中的Strict Mock和一般性Mock。
用Expectations类定义的,则mock对象在运行时只能按照 Expectations块中定义的顺序依次调用方法,不能多调用也不能少调用,所以可以省略掉Verifications块;
而用NonStrictExpectations类定义的,则没有这些限制,所以如果需要验证,则要添加Verifications块。
上述的例子使用了非局部模拟,下面我们使用局部模拟来改写上面的测试,代码如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testHello() {
final MyObject obj = new MyObject();
new NonStrictExpectations(obj) {//录制预期模拟行为
{
obj.hello("Zhangsan");
returns("Hello Zhangsan");
//也可以使用:result = "Hello Zhangsan";
}
};
assertEquals("Hello Zhangsan", obj.hello("Zhangsan"));//调用测试方法
new Verifications() {//验证预期Mock行为被调用
{
obj.hello("Hello Zhangsan");
times = 1;
}
};
}
模拟静态方法:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockStaticMethod() {
new NonStrictExpectations(ClassMocked.class) {
{
ClassMocked.getDouble(1);//也可以使用参数匹配:ClassMocked.getDouble(anyDouble);
result = 3;
}
};
assertEquals(3, ClassMocked.getDouble(1));
new Verifications() {
{
ClassMocked.getDouble(1);
times = 1;
}
};
}
模拟私有方法:
如果ClassMocked类中的getTripleString(int)方法指定调用一个私有的multiply3(int)的方法,我们可以使用如下方式来Mock:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockPrivateMethod() throws Exception {
final ClassMocked obj = new ClassMocked();
new NonStrictExpectations(obj) {
{
this.invoke(obj, "multiply3", 1);//如果私有方法是静态的,可以使用:this.invoke(null, "multiply3")
result = 4;
}
};
String actual = obj.getTripleString(1);
assertEquals("4", actual);
new Verifications() {
{
this.invoke(obj, "multiply3", 1);
times = 1;
}
};
}
设置Mock对象私有属性的值:
我们知道EasyMock和PowerMock的Mock对象是通过JDK/CGLIB动态代理实现的,本质上是类的继承或者接口的实现,但是在java面向对象编程中,基类对象中的私有属性是无法被子类继承的,所以如果被Mock对象的方法中使用到了其自身的私有属性,并且这些私有属性没有提供对象访问方法,则使用传统的Mock方法是无法进行测试的,JMockit提供了设置Mocked对象私有属性值的方法,代码如下:
被测试代码:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class ClassMocked {
private String name = "name_init";
public String getName() {
return name;
}
private static String className="Class3Mocked_init";
public static String getClassName(){
return className;
}
}
使用JMockit设置私有属性:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockPrivateProperty() throws IOException {
final ClassMocked obj = new ClassMocked();
new NonStrictExpectations(obj) {
{
this.setField(obj, "name", "name has bean change!");
}
};
assertEquals("name has bean change!", obj.getName());
}
使用JMockit设置静态私有属性:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockPrivateStaticProperty() throws IOException {
new NonStrictExpectations(Class3Mocked.class) {
{
this.setField(ClassMocked.class, "className", "className has bean change!");
}
};
assertEquals("className has bean change!", ClassMocked.getClassName());
}
(2).基于状态的Mock方式:
JMockit上面的基于行为Mock方式和传统的EasyMock和PowerMock流程基本类似,相当于把被模拟的方法当作黑盒来处理,而JMockit的基于状态的Mock可以直接改写被模拟方法的内部逻辑,更像是真正意义上的白盒测试,下面通过简单例子介绍JMockit基于状态的Mock。
被测试的代码如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class StateMocked {
public static int getDouble(int i){
return i*2;
}
public int getTriple(int i){
return i*3;
}
}
改写普通方法内容:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockNormalMethodContent() throws IOException {
StateMocked obj = new StateMocked();
new MockUp<StateMocked>() {//使用MockUp修改被测试方法内部逻辑
@Mock
public int getTriple(int i) {
return i * 30;
}
};
assertEquals(30, obj.getTriple(1));
assertEquals(60, obj.getTriple(2));
Mockit.tearDownMocks();//注意:在JMockit1.5之后已经没有Mockit这个类,使用MockUp代替,mockUp和tearDown方法在MockUp类中
}
修改静态方法的内容:
基于状态的JMockit改写静态/final方法内容和测试普通方法没有什么区别,需要注意的是在MockUp中的方法除了不包含static关键字以外,其他都和被Mock的方法签名相同,并且使用@Mock标注,测试代码如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testGetTriple() {
new MockUp<StateMocked>() {
@Mock
public int getDouble(int i){
return i*20;
}
};
assertEquals(20, StateMocked.getDouble(1));
assertEquals(40, StateMocked.getDouble(2));
}
JMockit和PowerMock混用时不兼容问题:
由于PowerMock需要在单元测试类上添加@RunWith(PowerMockRunner.class)注解,用于表面使用PowerMock来执行单元测试,而JMockit不需要指定@RunWith注解,因此当一个单元测试类中混合使用PowerMock和JMockit时,JMockit总是会报错初始化失败,因此我建议不要在同一个单元测试类中混用PowerMock和JMockit。
另外,JMockit要求必须出现在JVM classpath的中Junit前面位置,因此在添加Maven依赖时记得要把JMockit放在Junit最前面,否则同样报错JMockit初始化失败。
统计JMockit的单元测试覆盖率:
由于JMockit使用JavaSE5中的java.lang.instrument包开发,因此一般的单元测试覆盖率统计插件和工具对其无法工作,必须要借助自带的JMockit coverage才行,对于使用Eclemma插件和maven+sonar方式的单元测试覆盖率统计,分别有如下方法:
(1).Eclemma插件方式:
如果直接使用Eclemma插件来统计单元测试覆盖率,会发现Eclemma长时间挂起阻塞,强行结束时会报错说找不到-javaagent等等,解决方法如下:
在Eclipse中右键选择Coverage as ->Coverage Configurations,配置Junit的JVM参数如下:
-javaagent:"${settings.localRepository}"/com/googlecode/jmockit/jmockit-coverage/0.999.24/jmockit-coverage-0.999.24.jar
其中${settings.localRepository}是maven资源目录,例如:
-javaagent:D:\userdata\administrator\.m2\repository\com\googlecode\jmockit\jmockitcoverage\0.999.24\jmockit-coverage-0.999.24.jar
(2).Maven+Sonar方式:
如果直接使用mvn sonar:sonar命令时,发现任何单元测试无法执行,长时间卡住,强行结束后再次执行时maven工程target目录下surefire目录无法删除,只有重启机器后才能删除,解决方法如下:
在pom文件中添加如下的插件:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<argLine>-javaagent:"${settings.localRepository}"/com/googlecode/jmockit/jmockit-coverage/0.999.24/jmockit-coverage-0.999.24.jar</argLine>
</configuration>
</plugin>
再次执行mvn sonar:sonar命令就可以正常统计出JMockit的单元测试覆盖率。
更多内容请参考JMockit官方文档:http://jmockit.googlecode.com/svn/trunk/www/tutorial.html。
http://blog.csdn.net/chjttony/article/details/17838693
之前《有效使用Mock编写java单元测试》一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具——JMockit。
引用单元测试中mock的使用及mock神器jmockit实践中的java单元测试中各种Mock框架对比,就能明白JMockit有多么强大:
JMockit是基于JavaSE5中的java.lang.instrument包开发,内部使用ASM库来动态修改java的字节码,使得java这种静态语言可以想动态脚本语言一样动态设置被Mock对象私有属性,模拟静态、私有方法行为等等,对于手机开发,嵌入式开发等要求代码尽量简洁的情况下,或者对于被测试代码不想做任何修改的前提下,使用JMockit可以轻松搞定很多测试场景。
通过如下方式在maven中添加JMockit的相关依赖:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
<dependency>
<groupId>com.googlecode.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.googlecode.jmockit</groupId>
<artifactId>jmockit-coverage</artifactId>
<version>0.999.24</version>
<scope>test</scope>
</dependency>
JMockit有两种Mock方式:基于行为的Mock方式和基于状态的Mock方式:
引用单元测试中mock的使用及mock神器jmockit实践中JMockit API和工具如下:
(1).基于行为的Mock方式:
非常类似与EasyMock和PowerMock的工作原理,基本步骤为:
1.录制方法预期行为。
2.真实调用。
3.验证录制的行为被调用。
通过一个简单的例子来介绍JMockit的基本流程:
要Mock测试的方法如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class MyObject {
public String hello(String name){
return "Hello " + name;
}
}
使用JMockit编写的单元测试如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Mocked //用@Mocked标注的对象,不需要赋值,jmockit自动mock
MyObject obj;
@Test
public void testHello() {
new NonStrictExpectations() {//录制预期模拟行为
{
obj.hello("Zhangsan");
returns("Hello Zhangsan");
//也可以使用:result = "Hello Zhangsan";
}
};
assertEquals("Hello Zhangsan", obj.hello("Zhangsan"));//调用测试方法
new Verifications() {//验证预期Mock行为被调用
{
obj.hello("Hello Zhangsan");
times = 1;
}
};
}
JMockit也可以分类为非局部模拟与局部模拟,区分在于Expectations块是否有参数,有参数的是局部模拟,反之是非局部模拟。
而Expectations块一般由Expectations类和NonStrictExpectations类定义,类似于EasyMock和PowerMock中的Strict Mock和一般性Mock。
用Expectations类定义的,则mock对象在运行时只能按照 Expectations块中定义的顺序依次调用方法,不能多调用也不能少调用,所以可以省略掉Verifications块;
而用NonStrictExpectations类定义的,则没有这些限制,所以如果需要验证,则要添加Verifications块。
上述的例子使用了非局部模拟,下面我们使用局部模拟来改写上面的测试,代码如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testHello() {
final MyObject obj = new MyObject();
new NonStrictExpectations(obj) {//录制预期模拟行为
{
obj.hello("Zhangsan");
returns("Hello Zhangsan");
//也可以使用:result = "Hello Zhangsan";
}
};
assertEquals("Hello Zhangsan", obj.hello("Zhangsan"));//调用测试方法
new Verifications() {//验证预期Mock行为被调用
{
obj.hello("Hello Zhangsan");
times = 1;
}
};
}
模拟静态方法:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockStaticMethod() {
new NonStrictExpectations(ClassMocked.class) {
{
ClassMocked.getDouble(1);//也可以使用参数匹配:ClassMocked.getDouble(anyDouble);
result = 3;
}
};
assertEquals(3, ClassMocked.getDouble(1));
new Verifications() {
{
ClassMocked.getDouble(1);
times = 1;
}
};
}
模拟私有方法:
如果ClassMocked类中的getTripleString(int)方法指定调用一个私有的multiply3(int)的方法,我们可以使用如下方式来Mock:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockPrivateMethod() throws Exception {
final ClassMocked obj = new ClassMocked();
new NonStrictExpectations(obj) {
{
this.invoke(obj, "multiply3", 1);//如果私有方法是静态的,可以使用:this.invoke(null, "multiply3")
result = 4;
}
};
String actual = obj.getTripleString(1);
assertEquals("4", actual);
new Verifications() {
{
this.invoke(obj, "multiply3", 1);
times = 1;
}
};
}
设置Mock对象私有属性的值:
我们知道EasyMock和PowerMock的Mock对象是通过JDK/CGLIB动态代理实现的,本质上是类的继承或者接口的实现,但是在java面向对象编程中,基类对象中的私有属性是无法被子类继承的,所以如果被Mock对象的方法中使用到了其自身的私有属性,并且这些私有属性没有提供对象访问方法,则使用传统的Mock方法是无法进行测试的,JMockit提供了设置Mocked对象私有属性值的方法,代码如下:
被测试代码:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class ClassMocked {
private String name = "name_init";
public String getName() {
return name;
}
private static String className="Class3Mocked_init";
public static String getClassName(){
return className;
}
}
使用JMockit设置私有属性:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockPrivateProperty() throws IOException {
final ClassMocked obj = new ClassMocked();
new NonStrictExpectations(obj) {
{
this.setField(obj, "name", "name has bean change!");
}
};
assertEquals("name has bean change!", obj.getName());
}
使用JMockit设置静态私有属性:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockPrivateStaticProperty() throws IOException {
new NonStrictExpectations(Class3Mocked.class) {
{
this.setField(ClassMocked.class, "className", "className has bean change!");
}
};
assertEquals("className has bean change!", ClassMocked.getClassName());
}
(2).基于状态的Mock方式:
JMockit上面的基于行为Mock方式和传统的EasyMock和PowerMock流程基本类似,相当于把被模拟的方法当作黑盒来处理,而JMockit的基于状态的Mock可以直接改写被模拟方法的内部逻辑,更像是真正意义上的白盒测试,下面通过简单例子介绍JMockit基于状态的Mock。
被测试的代码如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class StateMocked {
public static int getDouble(int i){
return i*2;
}
public int getTriple(int i){
return i*3;
}
}
改写普通方法内容:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testMockNormalMethodContent() throws IOException {
StateMocked obj = new StateMocked();
new MockUp<StateMocked>() {//使用MockUp修改被测试方法内部逻辑
@Mock
public int getTriple(int i) {
return i * 30;
}
};
assertEquals(30, obj.getTriple(1));
assertEquals(60, obj.getTriple(2));
Mockit.tearDownMocks();//注意:在JMockit1.5之后已经没有Mockit这个类,使用MockUp代替,mockUp和tearDown方法在MockUp类中
}
修改静态方法的内容:
基于状态的JMockit改写静态/final方法内容和测试普通方法没有什么区别,需要注意的是在MockUp中的方法除了不包含static关键字以外,其他都和被Mock的方法签名相同,并且使用@Mock标注,测试代码如下:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
@Test
public void testGetTriple() {
new MockUp<StateMocked>() {
@Mock
public int getDouble(int i){
return i*20;
}
};
assertEquals(20, StateMocked.getDouble(1));
assertEquals(40, StateMocked.getDouble(2));
}
JMockit和PowerMock混用时不兼容问题:
由于PowerMock需要在单元测试类上添加@RunWith(PowerMockRunner.class)注解,用于表面使用PowerMock来执行单元测试,而JMockit不需要指定@RunWith注解,因此当一个单元测试类中混合使用PowerMock和JMockit时,JMockit总是会报错初始化失败,因此我建议不要在同一个单元测试类中混用PowerMock和JMockit。
另外,JMockit要求必须出现在JVM classpath的中Junit前面位置,因此在添加Maven依赖时记得要把JMockit放在Junit最前面,否则同样报错JMockit初始化失败。
统计JMockit的单元测试覆盖率:
由于JMockit使用JavaSE5中的java.lang.instrument包开发,因此一般的单元测试覆盖率统计插件和工具对其无法工作,必须要借助自带的JMockit coverage才行,对于使用Eclemma插件和maven+sonar方式的单元测试覆盖率统计,分别有如下方法:
(1).Eclemma插件方式:
如果直接使用Eclemma插件来统计单元测试覆盖率,会发现Eclemma长时间挂起阻塞,强行结束时会报错说找不到-javaagent等等,解决方法如下:
在Eclipse中右键选择Coverage as ->Coverage Configurations,配置Junit的JVM参数如下:
-javaagent:"${settings.localRepository}"/com/googlecode/jmockit/jmockit-coverage/0.999.24/jmockit-coverage-0.999.24.jar
其中${settings.localRepository}是maven资源目录,例如:
-javaagent:D:\userdata\administrator\.m2\repository\com\googlecode\jmockit\jmockitcoverage\0.999.24\jmockit-coverage-0.999.24.jar
(2).Maven+Sonar方式:
如果直接使用mvn sonar:sonar命令时,发现任何单元测试无法执行,长时间卡住,强行结束后再次执行时maven工程target目录下surefire目录无法删除,只有重启机器后才能删除,解决方法如下:
在pom文件中添加如下的插件:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<configuration>
<argLine>-javaagent:"${settings.localRepository}"/com/googlecode/jmockit/jmockit-coverage/0.999.24/jmockit-coverage-0.999.24.jar</argLine>
</configuration>
</plugin>
再次执行mvn sonar:sonar命令就可以正常统计出JMockit的单元测试覆盖率。
更多内容请参考JMockit官方文档:http://jmockit.googlecode.com/svn/trunk/www/tutorial.html。
相关推荐
JMockit是一款强大的Java测试工具,它主要用于模拟和测试Java代码中的依赖,特别是在进行单元测试时。这款开源库使得开发者可以更容易地创建测试桩(stubs)和模拟对象(mocks),无需修改被测试代码,甚至在无法...
Java测试是确保代码质量、提高软件可靠性的重要环节,它通过自动化的方式验证程序的功能是否按预期工作,以及在各种情况下是否能够正确处理异常。 在Java中,JUnit是最常用的单元测试框架,它提供了断言方法来判断...
JMockit是一个流行的Java测试工具,它主要用于模拟和断言对象的行为,特别是在进行单元测试时。这个工具使得开发者能够在不修改源代码的情况下,对复杂的依赖关系进行模拟,从而简化测试过程。下面将详细介绍JMockit...
通过熟练掌握Jmockit,你可以编写出更加健壮和可维护的单元测试,确保代码的质量和稳定性。在实际项目中,Jmockit可以帮助你有效地隔离被测试代码,减少对真实环境的依赖,提高测试效率,让单元测试变得更加简单高效...
然后编写使用jmockit的单元测试,通过模拟对象和方法来测试目标代码。 执行Maven的`clean test`命令后,JaCoCo会生成覆盖率数据并生成报告。生成的报告通常位于`target/jacoco`目录下,提供HTML、XML和CSV等多种...
本文将详细介绍10款常用的Java测试工具,帮助开发者更好地了解和选择适合自己的测试工具。 1. JUnit:JUnit是最基础也是最广泛的Java单元测试框架,它支持注解、断言、异常测试等多种功能,使得编写测试用例变得...
JMockit Coverage,作为一款强大的Java测试覆盖率工具,它能帮助开发者了解代码被测试的程度,从而提升测试的有效性。本文将深入探讨JMockit Coverage的原理、使用方法及其在实际项目中的应用。 首先,JMockit ...
JUnit作为Java领域广泛使用的单元测试框架,极大地简化了测试工作。然而,对于一些特殊场景,如测试私有方法或者模拟依赖对象,JUnit的标准功能可能就显得力不从心了。这时,我们就需要引入第三方库来增强测试能力,...
JMockit是一款强大的Java测试工具,它允许开发者在单元测试中模拟任何Java代码,包括静态方法、构造器、final类和方法以及系统类。这款工具的出现极大地简化了Java应用程序的测试过程,尤其是对于那些难以测试或者有...
JMockit 是一款 Java 语言的测试框架,主要用于模拟(mocking)和验证对象的行为,以便在单元测试中隔离被测试代码。它支持行为和状态的测试,这使得测试更加灵活和全面。以下是对 JMockit 的关键知识点的详细解释:...
《JMockit:一个强大的Java测试工具》 在软件开发领域,测试是不可或缺的一部分,它确保了代码的质量和稳定性。JMockit是一个优秀的Java库,专门用于进行单元测试和模拟对象,尤其在处理复杂的依赖关系时表现突出。...
JMockit 是一个流行的Java测试框架,用于模拟和验证代码行为,特别是在进行单元测试时。这个"jmockit-1.6.rar"压缩包包含了JMockit 1.6版本的相关资源,允许开发者在他们的项目中引入这个工具来提高测试的质量和效率...
**JMockit 1.2:一款强大的Java测试工具** JMockit是一款广泛使用的Java单元测试框架,尤其在模拟和mocking对象方面表现卓越。它提供了简洁、灵活且高效的API,使得开发者能够在测试代码中轻松地模拟任何Java类或...
JMockit是一款强大的Java测试工具,它允许开发者在单元测试中模拟任何类或接口的行为,包括静态方法和构造函数。这个“jmockit使用例子”很可能会涵盖如何利用JMockit进行测试的基本步骤,以及如何改变静态方法的...
JMockit是一款用于Java应用程序的高级单元测试框架,它提供了丰富的API来帮助开发者创建高质量的单元测试。JMockit的核心能力在于其能够模拟(Mock)和伪装(Stub)Java类中的方法,从而使得开发者能够在隔离环境中...
Jmockit是一个Java库,主要用于模拟和验证代码的行为,特别是在单元测试中。它提供了强大的API,允许开发者在不修改原有代码的情况下,对类和接口的行为进行模拟,以测试其功能。 在深入理解Jmockit之前,我们需要...
2. **JMockit**:JMockit是一个强大的Java测试框架,支持模拟静态方法、final类和方法,以及非public成员,这使得对不可变对象和依赖于外部系统或资源的类的测试变得可行。 3. **Codahale Metrics**:这个库提供了...
1. **jmockit.jar**:这是一个Java模拟框架,用于单元测试和集成测试。在DDT中,它可以帮助我们模拟复杂的依赖关系,隔离被测试代码,以便专注于测试特定功能,而不受其他部分的影响。我们可以为不同的数据输入创建...