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);}
}

View Code

UseSimpleTool.java代码如下:

public class UseSimpleTool {public String fun1(String name) {SimpleTool simpleTool = new SimpleTool();return simpleTool.fun1(name);}
}

View Code

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 {@MockedSimpleTool simpleTool;@Testpublic void testExpectation() {//未mock函数返回nullnew 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;}};}
}

View Code

输出:

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 {@InjectableSimpleTool simpleTool;@Testpublic void testExpectation() {//未mock函数返回nullnew 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;}};}
}

View Code

输出:

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 {@MockedSimpleTool simpleTool;@Testpublic 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;}};}
}

View Code

输出:

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 {@Testpublic void testMockUp() {//影响该类所有实例new MockUp<SimpleTool>(){//未mock函数不受影响
            @Mockpublic 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"));}
}

View Code

输出:

(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 {@Testpublic void testMockUp() {//影响该类所有实例new MockUp<SimpleTool>(){//未mock函数不受影响
            @Mockpublic 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"));}
}

View Code

输出:

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为一样的效果
    @InjectableSimpleInterface simpleInterface;@Testpublic void testUpper() throws Exception {SimpleInterface mockInstance =  new MockUp<SimpleInterface>() {@Mockpublic String getCityName() {return "BEIJING(MOCK)";}@Mockpublic 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());}
}

View Code

输出:

BEIJING(MOCK)
HUABEI(MOCK)
null
null
default city
default area

转载于:https://www.cnblogs.com/Ming8006/p/7930436.html

JMockit常用操作相关推荐

  1. jmockit教程_JMockit常用操作

    JMockit常用操作 目录 1 基本概念 1.1 常用注解 @Mocked:被修饰的对象将会被Mock,对应的类和实例都会受影响(同一个测试用例中) @Injectable:仅Mock被修饰的对象 ...

  2. TensorFlow常用操作:代码示例

    1,定义矩阵代码示例: import tensorflow as tftf.zeros([3,4]) #定义3行4列元素均为0的矩阵tensor=tf.constant([1,2,3,4])#定义一维 ...

  3. Ubuntu 常用操作

    Ubuntu常用操作 外观操作 修改应用icon图标 终端美化 内存管理 内存查询 分区管理 日志清理 操作执行 自动执行多条命令 外观操作 修改应用icon图标 在/usr/share/applic ...

  4. IOS沙盒Files目录说明和常用操作

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  5. 用Python轻松搞定Excel中的20个常用操作

    来源 |早起Python(ID: zaoqi-python) Excel与Python都是数据分析中常用的工具,本文将使用动态图(Excel)+代码(Python)的方式来演示这两种工具是如何实现数据 ...

  6. python和R对dataframe的常用操作的差异:head、tail、shape、dim、nrow、ncol、descirbe、summary、str

    python和R对dataframe的常用操作的差异:head.tail.shape.dim.nrow.ncol.descirbe.summary.str # python df.head() # R ...

  7. 【node】Sequelize常用操作、基本增删改查

    [node]Sequelize常用操作.基本增删改查 sequelize初始化 先初始化一个数据库实例 再初始化一个model实例 sequelize的数据类型 基本增删改查的写法 SELECT * ...

  8. JavaScript:对Object对象的一些常用操作总结

    JavaScript对Object对象的一些常用操作总结. 一.Object.assign() 1.可以用作对象的复制 var obj = { a: 1 }; var copy = Object.as ...

  9. ubuntu的学习教程(常用操作)

    摘要 最近在学习linux,把自己学习过程中遇到的常用操作以及一些有助于理解的内容记录下来.我主要用的是ubuntu系统 命令提示符 '~' 这个是指用户的家目录,用户分为root用户和普通用户,ro ...

最新文章

  1. 第二章 数据类型、运算符与表达式
  2. 5G都不能取代的Wi-Fi6,到底有多厉害?
  3. 工信部制定VR行业标准-谋定研究:对话中国经济和信息化
  4. unity android 原生,unity创建Android原生插件
  5. git 源代码自动检查_除了GitHub,你还知道那些免费源代码托管网站?
  6. VC6.0调试知识大全
  7. 剑指offer面试题[36]-数组中的逆序对
  8. 不要在考虑需求之前更多的在意你的职业镀金
  9. CAD的菜单栏消失,如何再次调出来
  10. opencms mysql_[转]OpenCms for MySql 安装图解
  11. Android原生系统真的那么好用吗?安卓原生系统吊打其他系统,因为有Google-Play
  12. 如何用自己的电脑开WiFi热点
  13. 解决git push报错问题
  14. 如何写好产品需求文档
  15. 计算机启动灯光提示,开机电脑指示灯红色常亮是怎么回事?
  16. Win 10 任务栏中Google开启时出现两个Google图标
  17. Reason Studios Reason 12 v12.2.5 WiN 音乐制作软件和机架插件
  18. 安卓4.4pppoe拨号间隔及轮次修改
  19. BH1750简单介绍
  20. Springboot + Shiro——MD5 盐值加密(配置)

热门文章

  1. ContOS 7 安装Jenkins
  2. Jquery遮罩插件,想罩哪就罩哪!
  3. JedisPool介绍
  4. Netbeans Platform的Lookup -- 边学边记
  5. IPv6網絡開發范例
  6. python函数详解_Python函数详解(转)
  7. Android中关于Volley的使用(一)加载图片
  8. 正则表达式去除连续重复的字符
  9. nginx 的启动、停止与重启
  10. java反射 一些理解