zoukankan      html  css  js  c++  java
  • EasyMock

      JUnit是Java开发中常用的单元测试工具,对方法的测试很合适,但是一些情况下,JUnit就不是很适用了:

       对象结构复杂、难以构造,对象的某些行为很难触发 。这时可以使用Mock来创建对象进行测试,同时还可以Mock一个未实现的接口来进行测试,简单的看就是模拟。

      EasyMock是针对Java的Mock工具,通过 EasyMock,我们可以为指定的接口动态的创建 Mock 对象:

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

      下载所需的jar包:easymock-3.2.jar,junit-4.4.jar,objenesis-1.1.jar。

       

      EasyMock-3.1 之前默认只支持为接口生成 Mock 对象,如果需要为类生成 Mock 对象,需要扩展包实现此功能。EasyMock-3.1之后的可为类Mock对象,但是需要objenesis的jar包。

      final,private和静态方法,easymock也无法mock其行为,这时可以考虑PowerMock。

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

      IStudent接口类:

    package easyMock;
    
    public interface IStudent {
        public String doMethod1();
        public String doMethod2();
        public String doMethod3();
    
    }

      StudentApplication类:

    package easyMock;
    
    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;
        }
        
        
    
    }

      测试类TestStudentApplication:

    package easyMock;
    import org.easymock.EasyMock;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    
    public class TestStudentApplication {
        IStudent student;
        StudentApplication application;
        
        @Before
        public void init(){
            //使用 EasyMock 生成 Mock 对象;
            student=EasyMock.createMock(IStudent.class);
        }
        
        @Test
        public void testdoMethod(){      
            //设定 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);
           
        }
    }

     运行单元测试,测试结果为true。

     http://raychase.iteye.com/blog/1459228

  • 相关阅读:
    C++模板编译模型
    C++继承与构造函数、复制控制
    PHP判断用户是手机端?还是浏览器端访问?
    CentOS6.5搭建LNMP
    星级评分--封装成jquery插件
    扩展thinkphp5的redis类方法
    js实现星级评分之方法一
    js原型与继承
    一个基于Tp3.2(thinkphp3.2)的工会管理系统
    实验楼的php比赛题,网页数据提取。
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4249101.html
Copyright © 2011-2022 走看看