什么是Mock 测试

Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的对象(如 JDBC 中的ResultSet 对象,JPA的CRUDRepository,需要执行数据库操作的),用一个虚拟的对象(Mock 对象)来创建(覆盖方法返回)以便测试的测试方法。

  • JUnit 是一个单元测试框架。
  • Mockito 是用于数据模拟对象的框架。

when().thenReturn();

when( mockRepository.getMock("x") ).thenReturn( "1024" );
String mock= mockRepository.getMock("x");
assertEquals( "预期x=1024","1024", mock);

when(xxxx).thenReturn(yyyy); 是指定当执行了这个方法的时候,返回 thenReturn 的值,相当于是对模拟对象的配置过程,为某些条件给定一个预期的返回值。

HttpServletRequest request = mock(HttpServletRequest.class);
when(request.getParameter("csdn")).thenReturn("zhengkai");
assertEquals( "预期csdn=zhengkai",request.getParameter("csdn"), "zhengkai");

Stub 打桩

Mockito 中 when().thenReturn(); 这种语法来定义对象方法和参数(输入),然后在 thenReturn 中指定结果(输出)。此过程称为 Stub 打桩 。一旦这个方法被 stub 了,就会一直返回这个 stub 的值。

!!!Stub 打桩 需要注意的是:

  • 对于 static 和 final 方法, Mockito 无法对其 when(…).thenReturn(…) 操作。
  • 当我们连续两次为同一个方法使用 stub 的时候,他只会只用最新的一次。

迭代打桩

打桩支持迭代风格的返回值,第一次调用 i.next() 将返回 ”Hello”,第二次的调用会返回 ”World”。

// 第一种方式 ,都是等价的
when(i.next()).thenReturn("Hello").thenReturn("World");
// 第二种方式,都是等价的
when(i.next()).thenReturn("Hello", "World");
// 第三种方式,都是等价的
when(i.next()).thenReturn("Hello"); when(i.next()).thenReturn("World");

void如何打桩

没有返回值的 void 方法呢?不需要执行,只需要模拟跳过,写法上会有所不同,没返回值了调用 thenReturn(xxx) 肯定不行,取而代之的用 doNothing().when().notify();

doNothing().when(obj).notify();
// 或直接
when(obj).notify();

抛出异常

when(i.next()).thenThrow(new RuntimeException());
doThrow(new RuntimeException()).when(i).remove(); // void 方法的
// 迭代风格
doNothing().doThrow(new RuntimeException()).when(i).remove();
// 第一次调用 remove 方法什么都不做,第二次调用抛出 RuntimeException 异常。

Any()

anyString() 匹配任何 String 参数,anyInt() 匹配任何 int 参数,anySet() 匹配任何 Set,any() 则意味着参数为任意值 any(User.class) 匹配任何 User类。

when(mockedList.get(anyInt())).thenReturn("element");
System.out.println(mockedList.get(999));// 此时打印是 element
System.out.println(mockedList.get(777));// 此时打印是 element

JUnit+Mockito单元测试之打桩when().thenReturn();相关推荐

  1. 《Pragmatic Unit Testing In Java with JUnit》—单元测试之道读后感

    <Pragmatic Unit Testing In Java with JUnit>                                                    ...

  2. Android 单元测试之Mockito

    在博客Android 单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简单的单元测试例子.在文章中,我们只是展示了对有返回类型的目标public方法进行了单 ...

  3. 单元测试之Mockito

    在单元测试中,应尽量消除测试代码与系统.其他类之间的关系,在隔离的情况下测试代码. Junit单元测试存在的问题 但是随着工程的壮大,使用上篇文章介绍的Junit进行单元测试,存在以下问题 待测试代码 ...

  4. 单元测试之带你搞懂Mockito使用

    Mock介绍 在平时开发过程中,我们往往会遇到以下问题 1.由于依赖调用的接口没有开发完成,需要等待(客户端和服务端,服务端和其他服务之间) 2.自测时由于服务器故障等无法正常调用接口,或者一些边界条 ...

  5. 补习系列(8)-springboot 单元测试之道

    目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 spr ...

  6. Java单元测试之模拟利器-使用PowerMock进行Mock测试

    首页 国产Linux Linux命令 openSUSE ArchLinux Slackware FreeBSD Ubuntu CentOS Fedora Debian PHP教程 在线教程 登录 注册 ...

  7. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  8. Java基础学习总结(24)——Java单元测试之JUnit4详解

    Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @BeforeClass 全局只会执行一次,而且是第一个运行 @Before  ...

  9. Android单元测试之Local unit tests(上)

    Android单元测试之Local unit tests(上) 简介 本地单元测试 JUnit 4 添加依赖 测试例子 结论 Mockito 添加依赖 测试例子-mock基本使用 测试例子-mock与 ...

最新文章

  1. mybatis注解配置出现returned more than one row, where no more than one was expected
  2. windows平台下安装Mysql8.0.20版本
  3. 推荐算法注意点和DeepFM工程化实现
  4. sas infile和filename
  5. [vue-cli]vue-cli提供了的哪几种脚手架模板?
  6. day16-Dom提交表单以及其他
  7. 您的DST大礼包请查收
  8. 2019年,区块链不得不知的 9 件大事!
  9. 使用WMI和性能计数器监控远程服务器权限设置
  10. Python创建二维数组
  11. PMP第十三章:项目相关方管理
  12. NVIDIA、CUDA与CPU参数、计算能力对比学习
  13. 国内用户最多的linux系统,统信UOS将可能超越麒麟系统夺得中国Linux市场份额第一名...
  14. 假设检验实验和拟合优度检验练习题
  15. 移动端适配,华为浏览器底色无法正常显示
  16. 跨境电商系列 | 防范第三方脚本对数据隐私与安全的侵蚀
  17. 【 js 基础 】【 源码学习 】 setTimeout(fn, 0) 的作用
  18. 盛迈坤电商:店铺详情页设置的特点
  19. kafka部署时出现的天坑
  20. Java语言的基本介绍

热门文章

  1. 创建一个Worker类,具有属性 name sex salary level 创建一个linkedlist作为容器.录入5条工人信息
  2. 华为浮动路由和BFD配置
  3. sessionStorage中的setItem和getItem
  4. 20165214 2018-2019-2 《网络对抗技术》Exp4 恶意代码分析 Week6
  5. 日常生活小常识(10)
  6. python time timeit_Python timeit模块
  7. c++风格的程序,输入两个整数,将它们由小到大输出
  8. python笔记:8.2.3 非参数检验的基本问题_游程检验
  9. MT2601原厂datasheet资料下载
  10. wifi pineapple | WiFiPineapple plus 基本使用教程