说说初用 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

原文地址:https://www.cnblogs.com/GarfieldEr007/p/10197965.html

时间: 2024-10-30 23:00:04

说说初用 Mock 工具测试碰到的坑的相关文章

JAVA的mock工具mockito简介

在测试过程中,难免会碰到交互的外围系统不给力的情况,这时候mock就派上用场了,前段时间跟同学聊到这块的时候,他向我推荐mockito这个mock工具,试用了一下,确实很好用,这里给大家介绍下这款工具: 1.mockito的特点 它既能mock接口也能mock实体类(咱测试框架mock工具也能做到) 简单的注解语法[email protected] 简单易懂,语法简单 支持顺序验证 客户化参数匹配器 2.mockito的配置 只需依赖jar包即可:<dependency><groupId

初接触BurpLoader工具

初接触burp工具 菜鸟一枚,现在在接触一段时间测试,我在测试功能性的时候,想着网站被黑案例那么多,我是不是也应该弄弄安全性测试了,所以就有了下边的第一次接触BurpLoader工具来测试手机的app程序.我现在只是BurpLoader工具可以获取到android手机app端的http请求,大神请勿见笑,废话不多说开始. 1.准备工具 BurpLoader1.6 如果发现不能用,还需要在java官网上下载一个java的包,然后装上 android一枚 路由一枚(就是让手机和电脑处于同一网段的)

AUTOIT3_网管维护工具测试

首先要先设计个维护面板,看下图 设计完以后 把窗口生成器生成的代码 复制到SCITE编辑器里  红色部分就是需要我们写上去的代码 在SCITE里新建一个脚本 然后复制进去#include <GUIConstants.au3>#include <Process.au3> #Region ### START Koda GUI section ### Form=$Form1 = GUICreate("维护工具", 251, 81, 297, 252)$Button1

深入理解软件测试应用(测试用例+测试应用+测试技术及工具+测试等级)

我这里有个课程想和大家分享,有兴趣的朋友可以加我的QQ2059055336和我联系. 本课程为软件测试课程,主要讲述内容:软件测试概述.软件测试过程.软件测试技术.软件测试的应用.自动化测试技术等软件测试前言和问题的提出                             问题的提出 1课时                            基本概念                             本课程的主要内容                             各部分的

礼物挑选小工具测试

飞天小女警----礼物挑选小工具 测试产品链接:http://123.207.159.79:8088/giving_gifts/ 发布在作者的博客里面:http://www.cnblogs.com/shenbaishan/p/6071471.html 代码地址:HTTPS:https://git.coding.net/shenbaishan/gift-selection.git SSH:[email protected]:shenbaishan/gift-selection.git 1,有些图片

Online DDL gh-ost工具测试

OS:centos 6.5 DB:percona server 5.6.32 gh-ost:1.0.21 DB-M:192.168.128.128 DB-S : 192.168.128.129 简介: gh-ost是github开源的一款在线执行sql的开源工具.可以用于在线表结构变更(特别是大表,原因下面讲) 在线表结构变更,目前常用有以下几种方式: 1.小表:online ddl (5.6及其以后版本) 创建临时表为更改后的表结构,更新临时表数据,原表的新入数据记录入内存中的alter lo

Kali Linux下运行nfc工具测试!

由于Kali本身就集成了很多nfc工具,用起来很方便,再加上一个acr122u读卡器,来尝试PJ学校水卡! 首先安装驱动,到龙杰官网下载Linux的,解压后进入自己Linux发行版,Kali的是Debian的,直接是deb安装包,dpkg -i 安装就行了 接着安装debhelper libtool apt-get install -y debhelper libtool apt-get install debhelper 然后就可以连接设备,然后用vi修改这个文件 vi /usr/lib/pc

编译安装php-5.4.26、Xcache和MysqlAdmin、ab压力工具测试

一:安装PHP: 将php安装包和libmcrypt-devel开发包上传到安装的机器 1.安装libmcrypt-devel和bzip2解决依赖环境: [[email protected] php-5.4.26]# yum localinstall /tmp/libmcrypt-* [[email protected] php-5.4.26]# yum install bzip2* 2.解压php-5.4.26并编译安装 [[email protected] ~]# tar xvf php-5

Mock 模拟测试简介及 Mockito 使用入门

Mock 是什么 mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 简单的看一张图 我们在测试类 A 时,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类如 D.E.F 等,假如类 D.E.F 构造很耗时又或者调用很耗时的话是非常不便于测试的(比如是 DAO 类,每次访问数据库都很耗时).所以我们引入 Mock 对象. 如上图,我们将