Mock使用场景

  (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据,确保发布版本接口可用

  (2)调用第三方API接口,测试很慢,

  (3)编写满足所有外部依赖的测试可能很复杂,复杂到不值得编写,Mock模拟内部或外部依赖可以帮助我们解决这些问题

  (4)隔离当前方法使用的的所有依赖,让我们更加专注于单个单元,忽略其调用的代码的内部工作原理

Mock的好处:

  (1)Mock可以用来解除测试对象对外部服务的依赖(比如数据库,第三方接口等),使得测试用例可以独立运行。不管是传统的单体应用,还是现在流行的微服务,这点都特别重要,因为任何外部依赖的存在都会极大的限制测试用例的可迁移性和稳定性。

  (2)Mock的第二个好处是替换外部服务调用,提升测试用例的运行速度。任何外部服务调用至少是跨进程级别的消耗,甚至是跨系统、跨网络的消耗,而Mock可以把消耗降低到进程内。比如原来一次秒级的网络请求,通过Mock可以降至毫秒级,整整3个数量级的差别。

  (3)Mock的第三个好处是提升测试效率。这里说的测试效率有两层含义。第一层含义是单位时间运行的测试用例数,这是运行速度提升带来的直接好处。而第二层含义是一个测试人员单位时间创建的测试用例数。

  常用的Mock工具有jMock 、EasyMock 、Mockito等,但都有一个共同的缺点:不能mock静态、final、私有方法等。而PowerMock能够完美的弥补其他Mock工具的不足,如果需要mock静态方法。需要引入PowerMock。

  Springboot的  spring-boot-starter-test 已包含了Mockito,可以在Springboot项目里面直接使用。

PowerMock使用技巧

  ① @RunWith(PowerMockRunner.class)和@PrepareForTest(PowerMockClass.Class)这两个注解一定要加,否则PowerMock无效。@PrepareForTest中需要添加被测试的类,以及被测方法中需要mock的static方法所属的类。
  如果有多个类要添加,则格式为:
  @PrepareForTest({Class1.Calss,Class2.Class}).

  ② PowerMock各方法的语法(一般方法与Mockito用法一致):

  (1) void静态:PowerMockito.mockStatic(xxx.Class);
  PowerMockito.doNothing().when(mock,”methodName”,arg1,arg2);

  (2)有返回值静态:PowerMockito.mockStatic(xxx.Class);
  PowerMockito.when(mock.method()).thenReturn(value);

  (3)私有有返回值静态:PowerMockito.mock(xxx.Class);
  PowerMockito.when(mock,”methodName”,arg1,arg2).thenReturn(value);

  (4)构造函数:PowerMockito.mock(xxx.Class);
  PowerMockito.whenNew(xxx.Class).withAnyArguments().thenReturn();

测试示例

@RequestMapping(value = "", method = RequestMethod.POST)
public ReturnMsg crossDomainSetCookie(HttpServletRequest request, HttpServletResponse response,
String name, String value)
{
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies)
{
System.out.println("CookieName: " + c.getName() + " CookieValue: " + c.getValue());
} HttpSession session = request.getSession();
Enumeration<String> attributeNames = session.getAttributeNames();
while (attributeNames.hasMoreElements())
{
String element = attributeNames.nextElement();
System.out.println(element);
}
try
{
String authType = request.getAuthType();
System.out.println("auth type is:" + authType);
}
catch (Exception e)
{
System.out.println("exception message:" + e.getMessage());
} int status = response.getStatus();
System.out.println("the response status is:" + status);
return ReturnMsg.generatorSuccessMsg("success");
}

测试代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentControllerTest
{
/**
* 自动注入
*/
@Autowired
private StudentController studentController; @Test
public void crossDomainSetCookie()
{
HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
//Mock带参方法返回值
Mockito.when(request.getHeader("Origin")).thenReturn("127.0.0.1");
Cookie[] cookies = {new Cookie("Login", "true")};
//设置无参方法返回值
Mockito.when(request.getCookies()).thenReturn(cookies);
//Mock对象实例
HttpSession session = Mockito.mock(HttpSession.class);
Enumeration<String> en = Mockito.mock(Enumeration.class);
//Mock集合对象返回多个值,第一次返回值true,第二次返回值ture,第三次及以后返回false
Mockito.when(en.hasMoreElements()).thenReturn(true).thenReturn(true).thenReturn(false);
Mockito.when(en.nextElement()).thenReturn("login").thenReturn("loginFlag");
Mockito.when(session.getAttributeNames()).thenReturn(en);
Mockito.when(request.getSession()).thenReturn(session);
//Mock方法调用时抛出异常
doThrow(new IllegalArgumentException("nothing auth type!")).when(request).getAuthType(); HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
Mockito.when(response.getStatus()).thenReturn();
String value = "e10adc3949ba59abbe56e057f20f883e"; ReturnMsg msg = studentController.crossDomainSetCookie(request, response, "test", value);
System.out.println(msg.toString());
}
}

GItHub源码:https://github.com/lovelifeming/Resource/tree/master/SpringBoots/SpringBootDemo

备注:
作者:Shengming Zeng
博客:http://www.cnblogs.com/zengming/
严正声明:
1.由于本博客部分资源来自互联网,版权均归原作者所有。转载的目的是用于学术交流与讨论学习,将不对任何资源负法律责任。
2.若无意中侵犯到您的版权利益,请来信联系我,我会在收到信息后会尽快给予处理!
3.所有资源内容仅供学习交流之用,请勿用作商业用途,谢谢。
4.如有转发请注明出处,来源于http://www.cnblogs.com/zengming/ ,谢谢合作。

Mock测试接口的更多相关文章

  1. RPC接口mock测试

    转载:http://blog.csdn.net/ronghuanye/article/details/71124127 1        简介 Dubbo目前的应用已经越来越广泛.或者基于Dubbo二 ...

  2. Mock测试你的Spring MVC接口

    1. 前言 在Java开发中接触的开发者大多数不太注重对接口的测试,结果在联调对接中出现各种问题.也有的使用Postman等工具进行测试,虽然在使用上没有什么问题,如果接口增加了权限测试起来就比较恶心 ...

  3. 接口Mock测试

    什么是Mock测试? Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDB ...

  4. mock测试框架Mockito

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

  5. Spring MVC如何测试Controller(使用springmvc mock测试)

    在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过 ...

  6. Postman入门之Mock测试

    1.什么是Mock测试: mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法. 2.添加要Mock测试的接口为example: 2.1点击r ...

  7. java的mock测试框架

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

  8. PYTHON之MOCK WEB接口

    在日常的测试工作中,有时会有需要调用外部接口,拿到返回数据用以满足当前的测试任务的需求.但是当外部接口不可用,或者没有提供测试用环境时,我们就需要自己来mock一个接口的返回内容了,先让我们看一看下面 ...

  9. 【转】MOCK测试

    mock测试:就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象[mock对象]来创建以便测试的测试方法. mock对象:这个虚拟的对象就是mock对象. mock对象就是真 ...

随机推荐

  1. mysql中文、英文别名排序问题,order by 关键字详解

    order by 关键字详解:   SELECT intcode AS 商品编码, product_title AS 名称, retailprice AS 零售价, purchaseprice AS ...

  2. linux安装postgresql

    第一步在编译安装postgresql源码的时候,需要用到以下依赖,若本机没有的话,需要提前安装依赖环境,执行以下命令:yum install gcc gcc-c++yum install zlib-d ...

  3. Lua实现Map

    通过Lua中自带的table来实现一个Map,可以根据键值来插入移除取值 map = {} local this = map function this:new() o = {} setmetatab ...

  4. chm提取

    Python读写CHM文件 7z 可以将chm解包为HTML

  5. UML作业第三次:分析《书店图书销售管理系统》

    分析图书销售管理系统 一.概览 PlantUML类图语法学习小结 <书店图书销售管理>的类图元素 绘制类图脚本程序 绘制的类图 二.PlantUML类图语法 1.类之间的关系绘制 示例: ...

  6. 64位ubuntu16.04系统安装tensorflow_cpu

    ubuntu16.04安装tensorflow_cpu 一.安装anaconda: ①.下载anaconda包:Anaconda3-5.2.0-Linux-x86_64.sh 这是python3.6. ...

  7. 根据某字段将其他字段进行拼接的两种方法(SYS_CONNECT_BY_PATH及wm_concat)

    秘书姐姐说想知道她发起的所有流程,现在都到谁审批了.由于一条流程当前审批人可能有多个,故需根据单据编号(djbh)将审批人拼接到一个字段中. 说明: wfn审批历史记录表,djbh 单据编号,pk_c ...

  8. 前段时间碰到的一些问题(免费WiFi设置+fiddler对手机进行抓包+fiddler抓不到https的请求)

    这段时间转入移动端测试,对这块比较陌生,工作开展起来比较困难,所以好多东西都只是以解决问题为第一目标,没有去细细推敲其中原理,可能会有些语无伦次之感,但还是记一下当时解决问题的大致思路,供以后参考. ...

  9. c语言设计实验报告

    试验项目:1.字符与ASCLL码 2.运算符与表达式的运用 3.顺序结构应用程序 4.数学函数的算法描述 5.鸡兔同笼的算法描述 6.确定坐标的算法描述 姓名:熊承启 实验地点:514实验室 1.字符 ...

  10. Linux 的基本命令

    Linux 的基本命令 1. 文件操作 a) Windows 是多根的文件系统,物理上是 1 到多块硬盘,逻辑上分为 C.D.E……盘, 每个盘都是一棵树.Linux 是单根的文件系统,不分 CDE ...