JMockit常用操作
JMockit常用操作
2017-11-30 转自:http://blog.csdn.net/foreverling/article/details/51234149
目录
1 基本概念
1.1 常用注解
1.2 常用的类
2 实例演示
2.1 Status-based
2.1.1 实例1:Mocked - 被Mock修饰的对象,对应的类和实例都会受影响
2.1.2 实例2:injectable - 仅Mock被修饰的对象
2.1.3 实例3:Delegate - 自己指定返回值,适合那种需要参数决定返回值的场景
2.2 Behavior-based
2.2.1 实例1:Mock对象公有方法
2.2.2 实例2:Mock对象私有方法
2.2.3 实例3:Mock接口
源代码:JMockitTest.zip
JMockit教程:http://jmockit.org/tutorial.html
1 基本概念
1.1 常用注解
- @Mocked:被修饰的对象将会被Mock,对应的类和实例都会受影响(同一个测试用例中)
- @Injectable:仅Mock被修饰的对象
- @Capturing:可以mock接口以及其所有的实现类
- @Mock:MockUp模式中,指定被Fake的方法
1.2 常用的类
- Expectations:期望,指定的方法必须被调用
- StrictExpectations:严格的期望,指定方法必须按照顺序调用
- NonStrictExpectations:非严格的期望,是否调用和顺序不作要求
- Verifications:验证,一般配合NonStrictExpectations来使用
- Invocation:工具类,可以获取调用信息
- Delegate:自己指定返回值,适合那种需要参数决定返回值的场景,只需指定匿名子类就可以。
- MockUp:模拟函数实现
- Deencapsulation:反射工具类
2 实例演示
现有两个类作为测试对象: SimpleTool.java、UseSimpleTool.java
SimpleTool.java代码如下:
public class SimpleTool {
public String fun1(String str) {
return "real: public String fun1(" + str + ")";
} private String fun2(String str) {
return "real: private String fun2(" + str + ")";
} public String fun3(String str) {
return "real: public String fun3(" + str + ")";
} public String fun4(String str) {
return fun2(str);
}
}
UseSimpleTool.java代码如下:
public class UseSimpleTool {
public String fun1(String name) {
SimpleTool simpleTool = new SimpleTool();
return simpleTool.fun1(name);
}
}
2.1 Status-based
2.1.1 实例1:Mocked - 被Mock修饰的对象,对应的类和实例都会受影响
import com.demo.SimpleTool;
import com.demo.UseSimpleTool;
import mockit.Expectations;
import mockit.Mocked;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
import org.junit.Test;
import org.junit.runner.RunWith; @RunWith(JMockit.class)
public class MockedAnnotationTest {
@Mocked
SimpleTool simpleTool; @Test
public void testExpectation() {
//未mock函数返回null
new Expectations() {
{
simpleTool.fun1(anyString);
result = "MOCK";
}
}; System.out.println(simpleTool.fun1("param"));
System.out.println(simpleTool.fun3("param"));
System.out.println(new UseSimpleTool().fun1("param")); new Verifications() {
{
simpleTool.fun1(anyString);
times = 2;
}
};
}
}
输出:
MOCK
null
MOCK
2.1.2 实例2:injectable - 仅Mock被修饰的对象
import com.demo.SimpleTool;
import com.demo.UseSimpleTool;
import mockit.Expectations;
import mockit.Injectable;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
import org.junit.Test;
import org.junit.runner.RunWith; @RunWith(JMockit.class)
public class InjectableAnnotationTest {
@Injectable
SimpleTool simpleTool; @Test
public void testExpectation() {
//未mock函数返回null
new Expectations() {
{
simpleTool.fun1(anyString);
result = "MOCK";
}
}; System.out.println(simpleTool.fun1("param"));
System.out.println(simpleTool.fun3("param"));
System.out.println(new UseSimpleTool().fun1("param")); new Verifications() {
{
simpleTool.fun1(anyString);
times = 1;
}
};
}
}
输出:
MOCK
null
real: public String fun1(param)
2.1.3 实例3:Delegate - 自己指定返回值,适合那种需要参数决定返回值的场景
import com.demo.SimpleTool;
import com.demo.UseSimpleTool;
import mockit.Delegate;
import mockit.Expectations;
import mockit.Mocked;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
import org.junit.Test;
import org.junit.runner.RunWith; @RunWith(JMockit.class)
public class DelegateResultTest {
@Mocked
SimpleTool simpleTool; @Test
public void testExpectation() { new Expectations() {
{
simpleTool.fun1(anyString);
result = new Delegate<String>() {
public String aDelegateMethod(String str) {
return str.equals("param0") ? "MOCK0" : "MOCK1";
}
};
}
}; System.out.println(simpleTool.fun1("param0"));
System.out.println(simpleTool.fun3("param"));
System.out.println(new UseSimpleTool().fun1("param1")); new Verifications() {
{
simpleTool.fun1(anyString);
times = 2;
}
};
}
}
输出:
MOCK0
null
MOCK1
2.2 Behavior-based
2.2.1 实例1:Mock对象公有方法
import com.demo.SimpleTool;
import com.demo.UseSimpleTool;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Test; public class MockPublicMethodTest {
@Test
public void testMockUp() {
//影响该类所有实例
new MockUp<SimpleTool>(){
//未mock函数不受影响
@Mock
public String fun1(String str) {
return "(MOCK)";
}
}; SimpleTool simpleTool = new SimpleTool();
System.out.println(simpleTool.fun1("param"));
System.out.println(simpleTool.fun3("param"));
System.out.println(new UseSimpleTool().fun1("param"));
}
}
输出:
(MOCK)
real: public String fun3(param)
(MOCK)
2.2.2 实例2:Mock对象私有方法
import com.demo.SimpleTool;
import com.demo.UseSimpleTool;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Test; public class MockPublicMethodTest {
@Test
public void testMockUp() {
//影响该类所有实例
new MockUp<SimpleTool>(){
//未mock函数不受影响
@Mock
public String fun1(String str) {
return "(MOCK)";
}
}; SimpleTool simpleTool = new SimpleTool();
System.out.println(simpleTool.fun1("param"));
System.out.println(simpleTool.fun3("param"));
System.out.println(new UseSimpleTool().fun1("param"));
}
}
输出:
real: public String fun1(param)
real: public String fun3(param)
(MOCK)
2.2.3 实例3:Mock接口
两个类作为测试对象:SimpleInterface、SimpleInterfaceImpl
SimpleInterface代码如下:
public interface SimpleInterface {
String getCityName();
String getAreaName();
}
SimpleInterfaceImpl代码如下:
public class SimpleInterfaceImpl implements SimpleInterface {
public String getCityName() {
return "default city";
}
public String getAreaName() {
return "default area";
}
}
实例
import com.demo.SimpleInterface;
import com.demo.SimpleInterfaceImpl;
import mockit.Injectable;
import mockit.Mock;
import mockit.MockUp;
import mockit.integration.junit4.JMockit;
import org.junit.Test;
import org.junit.runner.RunWith; @RunWith(JMockit.class)
public class MockInterfaceTest {
//此处使用Injectable和Mocked为一样的效果
@Injectable
SimpleInterface simpleInterface; @Test
public void testUpper() throws Exception {
SimpleInterface mockInstance = new MockUp<SimpleInterface>() {
@Mock
public String getCityName() {
return "BEIJING(MOCK)";
} @Mock
public String getAreaName() {
return "HUABEI(MOCK)";
} }.getMockInstance(); System.out.println(mockInstance.getCityName());
System.out.println(mockInstance.getAreaName());
System.out.println(simpleInterface.getCityName());
System.out.println(simpleInterface.getAreaName());
SimpleInterfaceImpl simpleInterfaceImpl = new SimpleInterfaceImpl();
System.out.println(simpleInterfaceImpl.getCityName());
System.out.println(simpleInterfaceImpl.getAreaName());
}
}
输出:
BEIJING(MOCK)
HUABEI(MOCK)
null
null
default city
default area
JMockit常用操作的更多相关文章
- 【三】用Markdown写blog的常用操作
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...
- php模拟数据库常用操作效果
test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...
- Mac OS X常用操作入门指南
前两天入手一个Macbook air,在装软件过程中摸索了一些基本操作,现就常用操作进行总结, 1关于触控板: 按下(不区分左右) =鼠标左键 control+按下 ...
- mysql常用操作语句
mysql常用操作语句 1.mysql -u root -p 2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...
- nodejs配置及cmd常用操作
一.cmd常用操作 1.返回根目录cd\ 2.返回上层目录cd .. 3.查找当前目录下的所有文件dir 4.查找下层目录cd window 二.nodejs配置 Node.js安装包及源码下载地址为 ...
- Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理
摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■ 详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...
- python 异常处理、文件常用操作
异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm
- byte数据的常用操作函数[转发]
/// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...
- Linux Shell数组常用操作详解
Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...
随机推荐
- http权威指南笔记
请求报文 响应报文GET /test/hi.txt HTTP/1.0 起始行 HTTP/1.0 200 OKAccept: text/* 首部 Content-type: text/plainAcce ...
- mysql存储引擎、事务
MySQL存储引擎介绍 文件系统 操作系统组织和存取数据的一种机制. 文件系统是一种软件. 文件系统类型 ext2 ext3 ext4 xfs 数据 不管使用什么文件系统,数据内容不会变化 不同 ...
- Mysql 远程登录及常用命令
第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...
- crontab定时任务(centos)
cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond stop /sbi ...
- leetcode第一天
leetcode 第一天 2017年12月24日 第一次刷leetcode真的是好慢啊,三道题用了三个小时,而且都是简单题. 数组 1.(674)Longest Continuous Increasi ...
- handler机制面试
handler面试必问 解析: Android提供了Handler和Looper来满足线程间的通信. Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message E ...
- kubernetes 命令使用
学会命令的查找和使用,而不是死记命令,记命令不如提高英文水平 1.kubernetes环境搭建完成后,kubernetes环境搭建参考http://www.cnblogs.com/sosogengdo ...
- CompletableFuture CompletableFuture.supplyAsync 异常处理
CompletableFuture 异常处理completeExceptionally可以把异常抛到主线程 /** * User: laizhenwei * Date: 2018-01-30 Time ...
- HashMap/HashSet,hashCode,哈希表
hash code.equals和“==”三者的关系 1) 对象相等则hashCode一定相等: 2) hashCode相等对象未必相等. == 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同 ...
- 移动端开发利器vConsole.js,app内嵌H5开发时调试用
vConsole:一个轻量.可拓展.针对手机网页的前端开发者调试面板,主要还是用于内嵌app页面时在手机上进行调试,打印完全和在PC端一样,方便大家找出问题所在. 不说废话直接进入主题,vConsol ...