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常用操作的更多相关文章

  1. 【三】用Markdown写blog的常用操作

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  2. php模拟数据库常用操作效果

    test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...

  3. Mac OS X常用操作入门指南

    前两天入手一个Macbook air,在装软件过程中摸索了一些基本操作,现就常用操作进行总结, 1关于触控板: 按下(不区分左右)            =鼠标左键 control+按下        ...

  4. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  5. nodejs配置及cmd常用操作

    一.cmd常用操作 1.返回根目录cd\ 2.返回上层目录cd .. 3.查找当前目录下的所有文件dir 4.查找下层目录cd window 二.nodejs配置 Node.js安装包及源码下载地址为 ...

  6. Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理

    摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■  详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...

  7. python 异常处理、文件常用操作

    异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm

  8. byte数据的常用操作函数[转发]

    /// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...

  9. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

随机推荐

  1. http权威指南笔记

    请求报文 响应报文GET /test/hi.txt HTTP/1.0 起始行 HTTP/1.0 200 OKAccept: text/* 首部 Content-type: text/plainAcce ...

  2. mysql存储引擎、事务

    MySQL存储引擎介绍 文件系统 操作系统组织和存取数据的一种机制. 文件系统是一种软件. 文件系统类型 ext2  ext3  ext4  xfs 数据 不管使用什么文件系统,数据内容不会变化 不同 ...

  3. Mysql 远程登录及常用命令

    第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...

  4. crontab定时任务(centos)

    cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond stop /sbi ...

  5. leetcode第一天

    leetcode 第一天 2017年12月24日 第一次刷leetcode真的是好慢啊,三道题用了三个小时,而且都是简单题. 数组 1.(674)Longest Continuous Increasi ...

  6. handler机制面试

    handler面试必问 解析: Android提供了Handler和Looper来满足线程间的通信. Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message E ...

  7. kubernetes 命令使用

    学会命令的查找和使用,而不是死记命令,记命令不如提高英文水平 1.kubernetes环境搭建完成后,kubernetes环境搭建参考http://www.cnblogs.com/sosogengdo ...

  8. CompletableFuture CompletableFuture.supplyAsync 异常处理

    CompletableFuture 异常处理completeExceptionally可以把异常抛到主线程 /** * User: laizhenwei * Date: 2018-01-30 Time ...

  9. HashMap/HashSet,hashCode,哈希表

    hash code.equals和“==”三者的关系 1) 对象相等则hashCode一定相等: 2) hashCode相等对象未必相等. == 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同 ...

  10. 移动端开发利器vConsole.js,app内嵌H5开发时调试用

    vConsole:一个轻量.可拓展.针对手机网页的前端开发者调试面板,主要还是用于内嵌app页面时在手机上进行调试,打印完全和在PC端一样,方便大家找出问题所在. 不说废话直接进入主题,vConsol ...