Mock测试框架(Mockito为例)
在做单元测试的时候,有的时候用到的一些类,我们构造起来不是那么容易,比如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为例)的更多相关文章
- mock测试框架Mockito
无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...
- java的mock测试框架
无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...
- 测试框架Mockito使用笔记
Mockito,测试框架,语法简单,功能强大! 静态.私有.构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito. ...
- Java测试框架Mockito源码分析
1.Mockito简介 测试驱动的开发(Test Driven Design, TDD)要求我们先写单元测试,再写实现代码.在写单元测试的过程中,一个很普遍的问题是,要测试的类会有很多依赖,这些依赖的 ...
- Mock测试框架
一.前言 使用Mock框架进行单元测试,能够使用当前系统已经开发的接口方法模拟数据.(未写完,慢慢完善) 二.例子 1.引用Moq
- 【Android自动化】unittest测试框架关于用例执行的几种方法
# -*- coding:utf-8 -*- import unittest class test(unittest.TestCase): def setUp(self): print 'This i ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
- 用maven搭建 testNG+PowerMock+Mockito测试框架
单元测试是开发中必不可少的一部分,是产品代码的重要保证. Junit和testNG是当前最流行的测试框架,Junit是使用最广泛的测试框架,有兴趣的话自己baidu一下. testNG基于Junit和 ...
- 使用强大的 Mockito 测试框架来测试你的代码
原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...
随机推荐
- 性能测试分析过程(三)linux下查看最消耗CPU/内存的进程
linux下查看最消耗CPU 内存的进程 1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10 ...
- Nacos学习
Nacos是阿里开源的一个新框架,在分布式的架构中,Nacos同时扮演着服务注册中心和配置中心的角色.今天主要讲的是Nacos作为服务注册中心. 分布式中著名的CAP理论,任何一种服务注册中心都只能实 ...
- RSA前台加密后台解密
RSA解密时BadPaddingException java rsa 解密报:javax.crypto.BadPaddingException: Decryption error Java安全架构__ ...
- openresty开发系列34--openresty执行流程之4访问阶段
openresty开发系列34--openresty执行流程之4访问阶段 访问阶段 用途:访问权限限制 返回403 nginx:allow 允许,deny 禁止 allow ip:deny ip: 涉 ...
- Spring cloud微服务安全实战-6-10sentinel之热点和系统规则
热点规则 热点就是经常访问的数据.很多时候我们希望争对某一些热点数据,然后来进行限制.比如说商品的信息这个服务,我们给它做一个限流,qps是100,某一天我想做一个秒杀活动,可能会有很大的流量,这个时 ...
- GSON工具类
import java.util.Map; import com.google.gson.reflect.TypeToken; import com.google.gson.FieldNamingPo ...
- Python中request的post请求报requests.exceptions.SSLError:
今天发送一个post请求,提示错误 requests.exceptions.SSLError: HTTPSConnectionPool(host='user.zaful.com', port=443) ...
- 开发日记:常用BAT批处理
备份文件:BackupSourceCode.bat ::自动备份当前文件夹 ::by luomg, 21:15 2010-10-13 ::minguiluo@163.com @echo off tit ...
- 使用objcopy实现将文件编译进执行程序
一.简介 工作中可能遇到将一个文件编译进执行程序的需求,例如bin文件.jpg文件等等.实现的方法可以使用脚本来将文件内容写入一个新的C源文件数组,达成编译进程序的目的. 现在介绍一种简单.快捷的方 ...
- pyhton数据类型:字典、集合、列表、元组
基本常识 元组 列表 字典 集合 初始化 tuple=(1,2,3,4) list=[1,2,3,4] dic={'a':12,'b':34} set={1,2,3,4} 元素索引 tuple[0] ...