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 ...
随机推荐
- JQuery selector form input
var inputPhoneInFormActivity = $("form#formtab input[name='phone']"); if(inputPhoneInFormA ...
- python之psutil模块
简述 psutil是一个跨平台库(http://code.google.com/p/psutil/) ,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系 ...
- Node.js+Express框架+Mongo学习(一)第一个node.js实例
1.在桌面新建一个空的文件夹,比如叫node,当然也可以在其它地方新建. 2.命令行进入到所新建的文件夹的目录,下载Express框架,再在这个文件夹里新建一个叫final的项目 3.在项目(fina ...
- 170道python面试题(转)
作者:麋鹿链接:https://www.zhihu.com/question/54513391/answer/779646691来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 基于thrift的node.js rpc服务
1.在node.js 服务下创建node_modules文件,npm install thrift 下载thrift到该文件下. 2.编写idl文件.user.thrift 内容如下: struct ...
- 消息发送函数OSMboxPostOpt()
消息发送函数OSMboxPostOpt() 作用,ucos 3中的消息邮箱,具有广播功能,发送一条消息就可以使所有等待该消息的任务进入就绪状态,从而完成消息分发功能,具有一个消息唤醒多个任务的机制.
- 面试必备:Java 原子操作的实现原理[精品长文]
本文整理自<Java并发编程的艺术>第二章 作者:方腾飞 魏鹏 程晓明 原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被 ...
- Unreal Engine 4 中的 UI 优化技巧
转自:https://mp.weixin.qq.com/s/bybEHM9tF-jBPxxqXfrPOQ## Unreal Open Day 2017 活动上 Epic Games 开发者支持工程师郭 ...
- java打包小记
1.一个类的 Hello.java class Hello{ public static void main(String[] agrs){ System.out.println("hell ...
- 【VS开发】#pragma pack(push,1)与#pragma pack(1)的区别
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...