前言
Jmockit是一个超强大的ut mock工具, 与其他mock工具最大的特点是可以对final类, 静态方法进行mock! 这是其他mock工具不可比的. 这也成为我们选它做ut的原因. 多种mock工具特色比较:
http://code.google.com/p/jmockit/wiki/MockingToolkitComparisonMatrix
一 jmockit加载注意事项
1 由于jmockit用到了jdk1.5的instrument特性, 所以必需用1.5以上的jdk运行
2 如果junit版本是4.x, 需要4.8以上的版本, 而且在设置classpath时jmockit.jar的路径要设置在junit.jar前. 这样保证使用jmockit的runner加载junit
3 jmockit还自带了ut覆盖率统计工具, 将jmockit-coverage.jar的路径加入classpath, 每次ut完成就会自动生成覆盖率报告, 方便省心.
二 jmockit实用技巧之MockUp类应用
Jmockit提供了多种mock方式共开发者使用, 但给我感觉最有用的一个类就是MockUp. 用它几乎能完成所有需要mock的操作:
<!--[if !supportLists]-->a) <!--[endif]-->mock接口. 使用MockUp.getMockInstance()方便mock接口, 特别是定义了多个方法的接口. 手工打桩需要写一个此接口的假实现, 但测试中只调用了接口的一个方法, 造成了其他没调用方法还要写一堆没用的实现. 用了MockUp打桩就只关注需要mock的方法即可:
package demo.jmockit;
public interface IService {
void doSth();
void doOtherthing();
}
接口中有两个方法, 使用Mock返回一个mock对象时只关注被调用的方法doSth()即可:
package demo.jmockit;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mockit;
import org.junit.Test;
public class TestCase {
@Test
public void testSth() throws Exception {
IService service = new MockUp<IService>() {
// 需要mock哪个方法就只写哪个方法的mock实现, 其他方法都可以忽略
@Mock
public void doSth() {
System.out.println("this is mock implement");
}
}.getMockInstance();
// 调用mock方法
service.doSth();
// 最后做还原动作, 确保用例之间不相互影响. 也可以放到test case的teardown方法中
Mockit.tearDownMocks();
}
}
<!--[if !supportLists]-->b) <!--[endif]-->mock final类或静态方法. 对于final类或静态方法, 其他mock工具基本没有好的办法, 但用MockUp就非常简单:
package demo.jmockit;
public class Utils {
public static String getFormatStr()throws Exception{
return "YYYY-mm-dd HH:MM:SS";
}
}
package demo.jmockit;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mockit;
import org.junit.After;
import org.junit.Test;
public class TestCase {
@Test
public void testMockStaticMethod() {
// 打印mock前返回值
System.out.println(Utils.getFormatStr());
new MockUp<Utils>() {
//除了static关键字, 其他方法定义内容保持与被mock方法一致(包括异常定义)
@Mock
public String getFormatStr() throws Exception {
return "OtherFormat: dd-mm-YYYY";
}
};
// 打印mock后返回值
System.out.println(Utils.getFormatStr());
}
@After
public void tearDown() {
// 最后做还原动作, 确保用例之间不相互影响.
Mockit.tearDownMocks();
}
}
分享到:
相关推荐
### C#静态方法与非静态方法的比较 在C#编程语言中,静态方法与非静态(实例)方法是两种非常重要的方法定义方式。这两种方法各有特点,在不同的场景下使用可以带来不同的效果。 #### 一、概念理解 **1. 静态方法...
### 静态(static)方法与重写(override) #### 一、概念解析 在面向对象编程语言中,如Java,方法重写(override)是一种重要的特性,它允许子类提供一个与父类相同签名的方法实现。这种方法的实现允许在运行时...
Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...
本篇文章将深入探讨“静态方法同步”与“非静态方法同步”的差异、应用场景以及它们如何影响程序的并发性能。 首先,我们来了解什么是同步。在Java中,同步是通过`synchronized`关键字实现的,它用于确保同一时间...
在Java编程语言中,`static`关键字扮演着至关重要的角色,它被用于声明类成员(如变量、方法)为静态的。静态成员不依赖于任何特定的对象实例,而是与类本身绑定,这意味着无论该类有多少个实例,静态成员只会有一份...
静态成员与静态方法 静态成员变量是一种特殊类型的成员变量,它可以在不创建类的对象的情况下使用,並被所有该类的实例所共享。静态成员变量的特点是,它可以在不创建类的对象实例的情况下使用,並且所有该类的实例...
然而,有些情况下,正常的单元测试框架可能无法覆盖到所有的情况,比如静态方法和私有方法的测试。这时,我们就需要引入特殊的工具,如PowerMock。本文将详细介绍如何利用PowerMock来模拟静态方法和私有方法,以便...
可以用来Mock JAVA代码中的静态方法
EXT dojochina Ext类静态方法是一个关于EXT框架在JavaScript中的使用的主题,主要聚焦于Ext类的静态方法。EXT是一个强大的前端开发框架,由Sencha公司开发,它提供了丰富的组件库,用于构建复杂的Web应用程序。在EXT...
20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20.静态方法.zip20....
静态方法内不能直接访问非静态(实例)属性,因为这些属性属于特定对象,而静态方法没有隐含的对象引用。 非静态方法(实例方法)则包含一个隐含的参数,即对象实例的引用,这个引用在栈中存储。当调用非静态方法时...
Java 中静态方法和非静态方法的区别 Java 作为一种功能强大、可靠性高、跨平台的编程语言,广泛应用于企业级应用开发、移动应用开发、云计算、大数据处理等领域。了解静态方法和非静态方法的区别是 Java 编程的基础...
Microsoft Visual Studio 2010做的C# winform类的静态成员及静态方法,主要代码: public class Student { private int IDBase = 20080000; private int ID; public static int StudentNumber; public string ...
本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至关重要的。在Java中,反射API(java.lang.reflect)允许我们获取类的信息,包括类名、构造函数、方法...
在Java编程语言中,静态方法和实例方法是两种不同类型的成员,它们在使用和功能上有所区别。静态方法是属于类级别的,而实例方法是属于对象级别的。理解这两种方法的特性对于编写高效的代码至关重要。 首先,调用...
方法名(参数)}”这种格式来调用Java类的静态方法。 开发环境:IntelliJ IDEA 2019.2.2 Spring Boot版本:2.1.8 新建一个名称为demo的Spring Boot项目。 1、pom.xml 加入Thymeleaf依赖 <groupId>org.spring...
JAVA静态方法和非静态方法的区别和实例 静态方法和非静态方法是 Java 编程语言中两个基本概念,它们在编程实践中扮演着重要角色。了解它们的区别和使用场景对于编写高效、可维护的代码至关重要。 什么是静态方法?...
下面我们将深入探讨静态方法、静态变量以及静态类等相关的知识点。 1. 静态方法 静态方法是与类关联,而不是与类的实例关联的方法。这意味着我们不需要创建类的实例就可以调用静态方法。它们在内存中只有一份,且在...
在C#编程中,面向对象是核心特性之一,它提供了静态类、构造方法以及静态方法等概念,这些是创建高效、可维护代码的关键元素。让我们深入探讨这些知识点。 首先,静态类是C#中不能被实例化的类,它们只包含静态成员...
在上面的代码中,`FindClass()`用于获取Java类的`jclass`对象,`GetStaticMethodID()`用于获取静态方法的ID,最后`CallStaticVoidMethod()`执行静态方法。注意检查可能的错误,如找不到类或方法,并处理可能出现的...