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:

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

@Mocked
SimpleTool simpleTool;@Test
public 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;}};
}

输出:

MOCK
null
MOCK

2.1.2 实例2:Injectable

@Injectable
SimpleTool simpleTool;@Test
public 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;}};
}

输出:

MOCK
null
real: public String fun1(param)

2.1.3 结果可变Delegate

@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 Mock对象公有方法

@Test
public 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"));UseSimpleTool useSimpleTool = new UseSimpleTool();System.out.println(useSimpleTool.fun1("param"));
}

输出:

(MOCK)
real: public String fun3(param)
(MOCK)

2.2.2 Mock对象私有方法

@Test
public void testMockUp() {new MockUp<SimpleTool>(){//未mock函数不受影响@Mockprivate String fun2(String str) {return "(MOCK)";}};SimpleTool simpleTool = new SimpleTool();System.out.println(simpleTool.fun1("param"));System.out.println(simpleTool.fun3("param"));System.out.println(simpleTool.fun4("param"));
}

输出:

real: public String fun1(param)
real: public String fun3(param)
(MOCK)

2.2.3 Mock接口

现有接口及其实现类如下:
SimleInterface.java:

public interface SimpleInterface {String getCityName();String getAreaName();
}

SimpleInterfaceImpl.java:

public class SimpleInterfaceImpl implements SimpleInterface {public String getCityName() {return "default city";}public String getAreaName() {return "default area";}
}

实例:

//此处使用Injectable和Mocked为一样的效果
@Injectable
SimpleInterface simpleInterface;@Test
public 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());
}

输出:

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

对于接口的Mock如何影响实现该接口的所有类的对象,尚需进一步研究。

转载:http://blog.csdn.net/foreverling/article/details/51234149

JMockit学习笔记相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

  10. NuGet学习笔记(3) 搭建属于自己的NuGet服务器

    文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...

最新文章

  1. linux 脚本socket通信,Linux实例:用socket通讯远程执行命令
  2. 【Go API 开发实战】Go API 开发实战教程简介(1-7)
  3. Linux内核网络数据包处理流程
  4. OpenShift 4 之 GitOps(7)用ArgoCD部署Pacman应用集群
  5. java初学者书籍_面向初学者的5本最佳Java核心书籍
  6. 字典:python的基础数据类型
  7. 计算机毕业设计Java安路友汽车租赁(源码+系统+mysql数据库+lw文档
  8. Java概述、Jdk的安装、关键字
  9. 唐奇安通道策略-python量化【backtrader回测】
  10. 【问天Block】STC15单片机PWM输出讲解
  11. 五问补盲(四)| 好用的补盲激光雷达,得满足哪些条件?
  12. XCTF easyCpp
  13. 怎么判断一篇英文论文是不是综述
  14. 【机器学习数据集】如何获得机器学习的练习数据?
  15. Linux下curses函数库的详细介绍
  16. STM8 fHSI和 fCPU分频
  17. 记一次APP去壳破解重新打包
  18. ICA原理推导及代码实现
  19. 是时候给出休谟问题的数学推导了
  20. 【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件

热门文章

  1. 洛谷 题解 P1757 【通天之分组背包】
  2. (一)HBase基础介绍
  3. JMeter基础教程1:若隐若现的参数化
  4. 合肥赛区结束,继续训练提升
  5. [如何构建自己的轮式移动机器人系统·从入门到放弃]机器人底层篇
  6. Oracle 过程中检查数据表存在与否
  7. Zero Sum chapter 2.3 dfs
  8. CakePHP查询数据
  9. 解决VS2005在窗体设计界面中数据源窗口灰化不显示数据源的问题
  10. Vue.js刷新当前页面