说说初用 Mock 工具测试碰到的坑
我是一个在校实习生,作为一个程序猿,是个菜鸟中战斗机!对于测试,只写过一点点简单到不能再简单了的 Junit 单元测试的例子(因为当时这足以应付学校课程的内容与要求)。这几天在公司里要真枪实弹做测试的时候,就深深体会到了“书到用时方恨少”这句话的真谛了。没办法,谁叫我当初不多深入的学点呢。于是,在杜叔杜大神的指导下,开始了菜鸟的初用 Mock 工具,边学边用的爬坑之旅。
为什么要用 Mock 工具?
话不多说,我们先直接看看个最简单的例子:
测试目标:
public class ToBeTested {
public int add(int a, int b) {
return a+b;
}
public int plus(int a, int b){
return a*b;
}
}
测试用例:
public class test {
@Test
public void testEquals(){
ToBeTested t = new ToBeTested();
assertEquals(3,t.add(1,2));
assertEquals(8,t.plus(2,4));
}
}
这里我们是直接通过 new 来构建了一个 ToBeTested 的实例,因为这个类简单,而且待测试的方法里也没有依赖任何外部的对象,就一个简单的加法或乘法就完事了。但事情总是没有那么简单,在做单元测试的时候,我们要测试的方法往往都是需要依赖很多外部的对象,比如网络通讯,远程服务之类的,这些外部对象是我么没法控制的。难道这些外部依赖的对象都需要 new 一个出来吗 NO! 我们有 Mock! 我们可以用 Mock 工具来模拟这些外部对象,来完成我们的单元测试。还是先来看一个简单的 Mock 测试的例子吧:
public class test {
@Test
public void test(){
List<String> list = Mockito.mock(List.class);
list.add("coding");
verify(list).add("coding");
}
}
坑1 : spy
如果要用真实对象(而不是 Mock 出来的虚拟对象)中的真实的方法,则需要 spy 一下!看下面的例子:
我在测试目标代码中加了一个 compute 函数:
public int compute(int a){
int b = add(a,a);
int c = plus(a,a);
return b+c;
}
随后想当然的写了个对应的测试用例:
@Test
public void testCompute(){
ToBeTested t = new ToBeTested();
assertEquals(8, t.compute(2));
}
但聪明的你一看就知道,这不叫单元测试。因为我只是想测试 compute 这个函数是不是正确的,但 compute 却依赖于 add 和 plus 这两个函数。如果 add 函数里有错,也会导致 compute 出错,可这根本不关 compute 的事啊。所以,测试用例代码应该是这样的:
@Test
public void testCompute(){
ToBeTested t = spy(new ToBeTested());
when(t.add(2,2)).thenReturn(4);
when(t.plus(2, 2)).thenReturn(4);
assertEquals(8, t.compute(2));
}
注意!这里 new 一个真实对象 t 的时候,需要 spy 一下!(当时年轻不懂事,被这里卡了略久。。)因为这里用到了依赖的方法 add 和 plus。现在对于这个例子,compute 的结果已经不依赖别人了,哪怕 add 方法里,不知是哪个粗心的程序猿写成了 “return a - b ",这个测试也是通过的,因为这里有 when(t.add(2,2)).thenReturn(4);
这句话,stubbing 了 add 这个方法。这也符合单元测试的概念,我们现在只负责测试 compute 这个函数,才不管 add 或 plus 正确与否呢。
坑2:doReturn
等等,如刚刚所说,compute 已经不依赖 add 的返回结果了,那是不是当我们测试 compute 函数的时候,add 函数是不是就可以完全无法无天的乱来了呢?我们来看看这个:
public int add(int a, int b) {
ArrayList<String> list = new ArrayList<String>();
String s = list.get(0);
return a+b;
}
这时,当我们再次执行测试时,就抛异常了:java.lang.IndexOutOfBoundsException
。显然 list.get(0)
是罪魁祸首!奇怪?不是说 compute 已经不管 add 了吗? add 里面的代码有问题又怪我咯?别忘了,这还是 java 语言!所以,when(t.add(2,2)).thenReturn(4);
这语句还是会先去执行一遍 when 里面的函数, add(2,2). 至于返回结果是另外一回事。那么怎么解决这个问题呢?对!用 doReturn 语句!
@Test
public void testCompute(){
ToBeTested t = spy(new ToBeTested());
//when(t.add(2,2)).thenReturn(4);
doReturn(4).when(t).add(2,2);
when(t.plus(2, 2)).thenReturn(4); ;
assertEquals(8, t.compute(2));
}
现在好了, compute 已经完全不受 add 函数的影响了。add 函数爱怎么疯就怎么疯,不会影响 compute 函数的测试结果了,至此, compute 终于可以安静地完成它的单元测试了。
坑3: PowerMock
现如今比较流行的 Mock 工具如 jMock、EasyMock、Mockito 等都有一个共同的缺点:不能 mock 静态、final、私有方法等。而 PowerMock 能够完美的弥补以上三个 Mock 工具的不足。至于怎么做,去 Google 一下一大把的教程与实例,这里就不再多说了。。
坑4,5,6,8,。。。。。
慢慢踩 :)
from: https://blog.coding.net/blog/mock-testing-tools
说说初用 Mock 工具测试碰到的坑的更多相关文章
- 初接触BurpLoader工具
初接触burp工具 菜鸟一枚,现在在接触一段时间测试,我在测试功能性的时候,想着网站被黑案例那么多,我是不是也应该弄弄安全性测试了,所以就有了下边的第一次接触BurpLoader工具来测试手机的app ...
- 单元测试系列:Mock工具之Mockito实战
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...
- 单元测试系列:Mock工具Jmockit使用介绍
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...
- 单元测试系列之五:Mock工具之Mockito实战
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...
- 单元测试系列之二:Mock工具Jmockit实战
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...
- 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
最近栈长注意到阿里开源了自家的 Mock 工具:TestableMock,该工具号称最轻量.简单.舒适的 Mock 测试工具,功能十分强大,媲美 PowerMock,用法比 Mockito 还要简洁, ...
- 努力一周,开源一个超好用的接口Mock工具——Msw-Tools
作为一名前端开发,是不是总有这样的体验:基础功能逻辑和页面UI开发很快速,本来可以提前完成,但是接口数据联调很费劲,耗时又耗力,有时为了保证进度还不得不加加班. 为了摆脱这种痛苦,经过一周的努力,从零 ...
- golang使用interface来mock进行测试(来自dotGO2014)
源自于dotGO 2014的视频,讲述如何使用 interface 来mock 进行测试.. 可以FQ的同学自己观看,这里把重要的一些代码给截图搬到国内了 https://www.youtube.co ...
- linux 磁盘IO测试工具:FIO (同时简要介绍dd工具测试)
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. 目前主流的第三方IO测试工具有fio.iomete ...
随机推荐
- 【LOJ】#2128. 「HAOI2015」数字串拆分
题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...
- 黑马程序员_java基础笔记(14)...交通灯管理系统_编码思路及代码
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1,面试题——交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: ...
- 009.Zabbix幻灯片展示
一 Slide shows简介 Slide shows在多个Screens之间以幻灯片的方式来展示,使一个屏幕可以显示多个页面. 二 Slide shows配置 2.1 创建多个Screen Slid ...
- Nuxt.js 学习笔记
起源 最主要的原因时使用vue-cli搭建的SPA(单页应用)不利于搜索引擎的SEO操作.搜索引擎对SPA的抓取并不好,特别是百度根本没法抓取到SPA的内容页面,所以我们必须把我们的应用在服务端渲染成 ...
- php模板引擎之blade
一.简介模板引擎 模板引擎是将网站的页面设计和PHP应用程序几乎完全分离的一种解决方案,它能让前端工程师专注页面搭建,让后台工程师专注功能实现,以便实现逻辑分离,让每个人发挥所长.模板引擎技术的核心是 ...
- 8.8 正睿暑期集训营 Day5
目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...
- BZOJ.3680.吊打XXX(模拟退火/爬山算法)
题目链接 一个比较好的解释? 模拟退火(Simulated Annealing,SA): (1)初始化一个温度(充分大).初始解状态S.每个T值的迭代次数. (2)对i=1,...,L,做(3)至(7 ...
- JVM进程cpu飙高分析
在项目快速迭代中版本发布频繁 近期上线报错一个JVM导致服务器cpu飙高 但内存充足的原因现象. 对于耗内存的JVM程序来而言, 基本可以断定是线程僵死(死锁.死循环等)问题. 这里是纪录一下排 ...
- 使用 IntraWeb (7) - 主模板
TIWLayoutMgrHTML.TIWTemplateProcessorHTML 属于页面级的模板, 如果要全站统一模板, 当然要用主模板. TIWTemplateProcessorHTML 通过其 ...
- spring cloud 学习(5) - config server
分布式环境下的统一配置框架,已经有不少了,比如百度的disconf,阿里的diamand.今天来看下spring cloud对应的解决方案: 如上图,从架构上就可以看出与disconf之类的有很大不同 ...