在做单元测试的时候,有的时候用到的一些类,我们构造起来不是那么容易,比如HttpRequest,或者说某个Service依赖到了某个Dao,想构造service还得先构造dao,这些外部对象构造起来比较麻烦。 所以出现了Mock! 我们可以用 Mock 工具来模拟这些外部对象,来完成我们的单元测试。

  实现Mock技术的优秀开源框架有很多,下面以Mockito为例,用几个简单例子来介绍Mock工具的基本使用:

1.Mockito的第一个示例

 @Test
public void simpleTest(){ //创建mock对象,参数可以是类,也可以是接口
List<String> list = Mockito.mock(List.class); //设置方法的预期返回值 (如果list.get(0) 被调用 ,调用之后返回 helloworld)
//当然前提是要创建了Mock对象,如这里就是创建了跟 List相关的 Mock对象
//这里还看不出什么作用,因为Mock 还看不出来,List很容易就能创建
//假如是一个很复杂的对象,构造这样一个对象很有难度,使用Mock就很方便了,我们不用去一步一步填充它的属性去构造,
//只需要Mock 一下,就可以拿到这个对象,去测试它的方法,(当然,如果方法有参数我们是需要传递的,像get(0))
Mockito.when(list.get(0)).thenReturn("helloworld");
//list.get(0)的调用就会返回 helloworld
String result = list.get(0);
System.out.println(result); //验证方法调用(是否调用了get(0))
Mockito.verify(list).get(0); Assert.assertEquals("helloworld", result);
}
 @Test
public void testMockMethod() {
Class1Mocked obj=mock(Class1Mocked.class);① when(obj.hello("z3")).thenReturn("hello l4");② String actual=obj.hello("z3");③
assertEquals("hello l4",actual); verify(obj).hello("z3");④
//verify(obj,times(1)).hello("z3"); //可以加参数验证次数
}

  2.验证顺序

  @Test
public void testMockMethodInOrder() {
Class1Mocked objOther = Mockito.mock(Class1Mocked.class);
Class1Mocked objCn = Mockito.mock(Class1Mocked.class); Mockito.when(objOther.hello("z3")).thenReturn("hello l4");
Mockito.when(objCn.hello("z3")).thenReturn("hello 张三"); String other = objOther.hello("z3"); //这里决定了 objOther在先
Assert.assertEquals("hello l4", other);
String cn = objCn.hello("z3"); //这里决定了 objCn在后
Assert.assertEquals("hello 张三", cn); InOrder inOrder = Mockito.inOrder(objOther, objCn); //此行并不决定顺序,下面的两行才开始验证顺序
inOrder.verify(objOther).hello("z3");
inOrder.verify(objCn).hello("z3");
}

  3.非局部模拟

 // 非局部模拟(只能通过When().thenReturn() 来指定函数的返回类型,但是是调用不了 模拟出来的的类的方法的)
@Test
public void testSkipExpect() {
Class1Mocked obj = Mockito.mock(Class1Mocked.class); //如:正常如果hello方法被调用,应该返回z3,但这里返回的null ,说明该方法是没有被调用的
//因为我们模拟出来的是非局部变量
Assert.assertEquals(null, obj.hello("z3"));
//show方法也是一样,show方法如果执行应该打印一句话,但是obj并不能执行show方法
obj.show(); Mockito.verify(obj).hello("z3");
Mockito.verify(obj).show();
}

  4.局部模拟

 //局部模拟--spy()方式
@Test
public void testSpy() {
Class1Mocked obj = Mockito.spy(new Class1Mocked()); Mockito.doNothing().when(obj).show(); //有了这行,show方法被执行就不会有任何操作 Assert.assertEquals("z3",obj.hello("z3"));
obj.show(); Mockito.verify(obj).hello("z3");
Mockito.verify(obj).show();
}

  5.陷阱

 //值得注意的陷阱
@Test
public void testSpy2() {
Class1Mocked obj = Mockito.spy(new Class1Mocked());
//即使使用的是when thenReturn,但是仍然会执行方法里面的内容
Mockito.when(obj.hello("z3")).thenReturn("hello l4"); Assert.assertEquals("hello l4",obj.hello("z3")); Mockito.verify(obj).hello("z3");
}
 //如果既想使用局部模拟,又不想调用到方法里面的内容
@Test
public void testSpy3() {
Class1Mocked obj = Mockito.spy(new Class1Mocked()); Mockito.doReturn("hello l4").when(obj).hello("z3"); Assert.assertEquals("hello l4",obj.hello("z3")); Mockito.verify(obj).hello("z3");
}

参考博文:java的mock测试框架

Mock测试框架(Mockito为例)的更多相关文章

  1. mock测试框架Mockito

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  2. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  3. 测试框架Mockito使用笔记

    Mockito,测试框架,语法简单,功能强大! 静态.私有.构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito. ...

  4. Java测试框架Mockito源码分析

    1.Mockito简介 测试驱动的开发(Test Driven Design, TDD)要求我们先写单元测试,再写实现代码.在写单元测试的过程中,一个很普遍的问题是,要测试的类会有很多依赖,这些依赖的 ...

  5. Mock测试框架

    一.前言 使用Mock框架进行单元测试,能够使用当前系统已经开发的接口方法模拟数据.(未写完,慢慢完善) 二.例子 1.引用Moq

  6. 【Android自动化】unittest测试框架关于用例执行的几种方法

    # -*- coding:utf-8 -*- import unittest class test(unittest.TestCase): def setUp(self): print 'This i ...

  7. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  8. 用maven搭建 testNG+PowerMock+Mockito测试框架

    单元测试是开发中必不可少的一部分,是产品代码的重要保证. Junit和testNG是当前最流行的测试框架,Junit是使用最广泛的测试框架,有兴趣的话自己baidu一下. testNG基于Junit和 ...

  9. 使用强大的 Mockito 测试框架来测试你的代码

    原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...

随机推荐

  1. ElasticSearch5.2.2 安装(老版本)

    https://www.elastic.co/downloads/elasticsearchElasticSearch是一个高可扩展的开源的全文搜索分析引擎.它允许你快速的存储.搜索和分析大量数据.E ...

  2. plupload如何限制上传文件数量,限制只能上传单个文件

    1 完整代码 $(function() { $("#uploader").pluploadQueue({ runtimes : 'html5,gears,flash,silverl ...

  3. 027_MacOs上如何将多页word打印到一个页面上

    工作中需要把word的多页面内容打印到同一张A4纸,所以就想了办法,首先word导出到pdf. 然后使用MacOs默认的PDF阅读器进行多页打印. 操作如下: 文件-打印布局选择每张纸需要打印的页数左 ...

  4. python2中的unicode()函数在python3中会报错:

    python2中的unicode()函数在python3中会报错:NameError: name 'unicode' is not defined There is no such name in P ...

  5. Win 10 MSYS2 VS Code 配置 c++ 的编译环境

    博客参考 https://www.cnblogs.com/esllovesn/p/10012653.html 和 https://blog.csdn.net/bat67/article/details ...

  6. sudo passwd root:没有相关指令

    在linux里如果想要修改密码,就输入这个指令,但是会出现没找到这个指令,是因为环境变量里没有passwd. 解决:查找passwd的位置,sudo find / -name passwd 然后进入p ...

  7. python 传入任意多个参数(方法调用可传参或不传参)

    1.可传参数与不传参数,在定义中给参数设置默认值 class HandleYmal: """ 获取测试环境的配置 """ def __ini ...

  8. 两种Redis持久化原理的详解

    Redis为持久化提供了两种方式: RDB:在指定的时间间隔能对你的数据进行快照存储. AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据. 本文将通过下面内容的介 ...

  9. tp5之服务器不显示验证码

    今天在使用tp框架的时候遇到的一个bug,前辈们早已有解决方法,遇到了做个笔记 TP5框架,自带的验证码在本地localhost运行是没问题的,可以正常显示,如图: 然后,把框架拿到服务器是去运行,验 ...

  10. python常用的字符串格式化有哪几种?

    常用字符串格式化%和format 皇城PK Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为 ...