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 ...
随机推荐
- Calcite分析 - Rule
Calcite源码分析,参考: http://matt33.com/2019/03/07/apache-calcite-process-flow/ https://matt33.com/2019/03 ...
- gogs 邀请协作者 500错误
触发原因: 对db文件的user表删了某个用户导致 解决: 注册个新用户,把id改成原来的id(默认都会自增长)
- Cache busting
Cache busting https://www.keycdn.com/support/what-is-cache-busting https://curtistimson.co.uk/post/f ...
- 解决IDEA中Lombok生成代码后提示错误的问题
一.背景介绍 因为我们在使用Lombok的时候,Lombok为我们生成的代码是在字节码中(*.class),而不是在source code中,所以存在IDE提示Lombok生成的方法未定义的错误,导致 ...
- base64方式显示控件
data:,文本数据 data:text/plain,文本数据 data:text/html,HTML代码 data:text/html;base64,base64编码的HTML代码 data:tex ...
- [图片问答]打印html样式有问题
1.加载css样式,参考样例10 http://www.c-lodop.com/demolist/PrintSample10.html2.查看lodop内部解析的html信息,见http://www. ...
- 西门子PLC1200内使用SCL实现简化版PID算法
西门子自带的PID效果很好,但是会比较吃性能,使用次数有限,很多地方需要PID但不需要这么精准的PID,所以网上找个简单的算法自己调用. 新建数据类型 前三个就是PID三个参数 新建FC块: #PID ...
- linux查看哪个进程占用磁盘IO
方法一: $ iotop -oP 命令的含义:只显示有I/O行为的进程 测试结果: 方法二: $ pidstat -d 1 命令的含义:展示I/O统计,每秒更新一次 测试结果:
- 学习记录-java基础部分(一)
学习记录-java基础部分(一) 参考:GitHub上的知名项目:javaGuide : https://github.com/Snailclimb/JavaGuide/blob/master/doc ...
- flask,scrapy,django信号
简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...