当前位置: 首页 > news >正文

EasyMock的使用

1.Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。同时也可以当调用别人的模块,而该模块又没有实现时(只提供接口),我们可以在独立的环境中测试自己的模块逻辑。

2.使用前的准备,下载所需的jar包:easymock-3.0.jar(或以上版本),junit-4.4.jar,cglib-nodep-2.1_3.jar

3.使用方法较简单。主要有以下步骤:

 *•使用 EasyMock 生成 Mock 对象;
 *•设定 Mock 对象的预期行为和输出;
 *•将 Mock 对象切换到 Replay 状态;
 *•调用 Mock 对象方法进行单元测试;
 *•对 Mock 对象的行为进行验证。

测试实例:假如我有一个IStudent接口类和StudentApplication类,StudentApplication类中用到了IStudent中的没实现的方法,而我想测试StudentApplication,这时用EasyMock构造一个IStudent的Mock对象,并给要用到的的未实现的方法设定已知返回值。

code:

public interface IStudent {
    public String doMethod1();
    public String doMethod2();
    public String doMethod3();

}

public class StudentApplication {
    IStudent student=null;
    public StudentApplication(){
        
    }
    
    public String doMethod(){
        String str1=student.doMethod1();
        String str2=student.doMethod2();
        String str3=student.doMethod3();
        return str1+str2+str3;
    }

    public IStudent getStudent() {
        return student;
    }

    public void setStudent(IStudent student) {
        this.student = student;
    }
    
    

}




import main.IStudent;
import main.StudentApplication;

import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;


public class testStudentApplication {
    IStudent student;
    StudentApplication application;
    @Test
    public void testdoMethod(){
        //•使用 EasyMock 生成 Mock 对象;
        student=EasyMock.createMock(IStudent.class);
        //设定 Mock 对象的预期行为和输出
        EasyMock.expect(student.doMethod1()).andReturn("a").times(1);
        EasyMock.expect(student.doMethod2()).andReturn("b").times(1);
        EasyMock.expect(student.doMethod3()).andReturn("c").times(1);
        //将 Mock 对象切换到 Replay 状态
        EasyMock.replay(student);
        //调用 Mock 对象方法进行单元测试
        application=new StudentApplication();
        application.setStudent(student);
        String getStr=application.doMethod();
        //对 Mock 对象的行为进行验证
        String cstr="abc";//正确的字符串
        Assert.assertEquals(getStr, cstr);
        EasyMock.verify(student);
        
    }

}

  对于Mock对象方法中的参数必须是equals为true才可以,下面介绍参数:

 easymock中提供了非常多的方法来实现参数匹配,基本能满足一般参数匹配的要求。

    我们来具体看一下到底有哪些方法:

(1) 基于基本类型的比较

        1. eq(X value)方法, X 可以是boolean,byte,char, double,float,int,long,short,T

            有多个重载方法,支持基本类型如boolean, byte,char, double,float,int, long,short,后面会介绍它也支持Object比较。

            这个eq()方法的用法直接了当,基本数值直接比较数值,对于非整型的double和float,由于存在精度的问题,因此增加了以下两个方法来指定比较精度。

eq(double value, double delta) 
eq(float value, float delta) 


 2. aryEq(X[] values) X 可以是boolean,byte,char, double,float,int,long,short,T

            这个是eq(X value)方法的数组版本,要求比较的两个数组拥有相同的长度,然后每个元素都"相同",即都可以满足eq(X value)方法。

            注意到double和float并没有像eq(X value)方法那样提供可以设置精度的重载版本,不知道在数组比较时如何去设置容许精度。

 3. gt(X value), lt(X value), X 可以是byte,double,float,int,long,short

            这两个方法用于参数的大小匹配,适用于数值型的基本类型如byte,double,float,int,long,short。

 4. geq(X value), leq(X value)

            类似gt()和lt(),无非是将">"改为">=", "<"改为"<="。

 5. anyX(), X可以是Boolean, Byte, Char, Double, Float, Int, Long, Short

            这是一个宽松的匹配方法,任何数值都被视为匹配OK。这个方法在我们不介意参数值时特别有用。

(2) 基于对象的比较

 1. eq(T value)方法

            和基本类型类似,不过对于Object,是通过调用equals()方法来进行比较。

 2. same(T value) 方法

            和eq()不同,same()是通过比较对象引用来进行比较的。类似java代码中, a.equals(b)和a == b的差别。

 3. anyObject() 和 anyObject(Class<T> clazz)

            类似基本类型的any***()方法,非常宽松,在我们不介意参数值时使用。

            使用方式有三种

(T)EasyMock.anyObject() // 强制类型转换
EasyMock.<T> anyObject() // 固定返回的泛型
EasyMock.anyObject(T.class) // 在参数中指定返回的泛型 
        4. isA(Class<T> clazz)

            和anyObject(Class<T> clazz) 非常,唯一一个差别在于当输入参数为null时,anyObject(Class<T> clazz)返回true而isA(Class<T> clazz) 返回false。

(3) 逻辑计算

    easymock支持在参数匹配时进行一些简单的逻辑计算, 如and(), or (), not()。

    not()容易理解,取反而已。or()也容易理解,两个匹配方法匹配一个即可。

    但是and()方法我没能理解,不知道该怎么用,两个匹配方法同时匹配? 有知道的朋友,还望指教。 

 

   此外在参数匹配中,有几个特殊角色,享受的待遇与众不同,easymock为它们提供了专有方法。

1. Comparable

        对于实现了Comparable接口的对象,easymock提供了一系列的专用方法来处理,包括eq, gt, lt, geq, leq:

cmpEq(Comparable<T> value) 
gt(Comparable<T> value) 
lt(Comparable<T> value)
geq(Comparable<T> value) 
leq(Comparable<T> value)

        这个特殊处理非常合理,本来Comparable接口就提供了比较的功能,在参数匹配时应该容许直接使用。

2. string

        由于字符串匹配使用的场景非常多,因此easymock为此也提供了几个常见的参数匹配方法:

contains(String substring) 
startsWith(String prefix) 
endsWith(String suffix) 
find(String regex)

 其中contains/startsWith/endsWith是简单的字符串查找,而find()则通过支持正则表达式来提供复杂匹配。

3. null

        对于Object匹配,很常见的一个场景就是输入的参数为null,easymock中提供isNull() 和 notNull() 两个方法来完成对null值的匹配。

        开发中,经常会遇到下面这种场景,期望输入的参数满足isA()或者容许为null。而直接使用isA(),是不能支持null的,即如果参数为null时isA()会报不匹配。这个不是easymock的bug,而是刻意而为,解决的方法是使用 or(isA(...), isNull(...))或者anyObject()。

 

service.execute((ClassA) EasyMock.or(EasyMock.isA(ClassA.class), EasyMock.isNull()));
service.execute(EasyMock.anyObject(ClassA.class));

转载于:https://www.cnblogs.com/chyg/p/4140190.html

相关文章:

  • dssfsfsfs
  • Android应用程序资源的查找过程分析
  • C++中正确使用PRId64 (转载)
  • 一些变量(39~62)
  • [转]Java学习日记之 volatile
  • beta 分布的简单理解
  • 二. Weinre 调试 IOS Hybrid APP
  • careercup-C和C++ 13.10
  • 冬吴相对论锦言佳句--0005.薄伽梵歌与“印度式管理”
  • 实用脚本 4 -- Makefile(不同文件下的多个可执行文件or静态库编译到同一目录下)...
  • C# dataGridView不显示默认行的解决办法
  • 微信宣布降低企业号认证门槛 1000人以下的企业无需规模证明
  • thinkphp3.2分页
  • 临时数据更改规范
  • [xPlugin] smartupload jsp图片上传
  • Angular 响应式表单之下拉框
  • AWS实战 - 利用IAM对S3做访问控制
  • js操作时间(持续更新)
  • Js基础知识(四) - js运行原理与机制
  • mysql外键的使用
  • session共享问题解决方案
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue.js框架原理浅析
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 初识MongoDB分片
  • 大型网站性能监测、分析与优化常见问题QA
  • 第2章 网络文档
  • 对JS继承的一点思考
  • 开源SQL-on-Hadoop系统一览
  • 前端路由实现-history
  • 实现简单的正则表达式引擎
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 怎样选择前端框架
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​configparser --- 配置文件解析器​
  • ​什么是bug?bug的源头在哪里?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)Nginx简介和安装教程
  • (175)FPGA门控时钟技术
  • (C#)获取字符编码的类
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (接口封装)
  • (三) diretfbrc详解
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)Linux+Windows下安装ffmpeg
  • (转)LINQ之路
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ***测试-HTTP方法
  • .net wcf memory gates checking failed
  • .NET 常见的偏门问题
  • .net 获取url的方法
  • .net 生成二级域名