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

  • 相关阅读:
    springboot2整合seata(AT模式)
    SpringBoot2整合minio
    Minio安装(docker)、初始密码及界面操作
    elasticsearch mapper创建
    elasticsearch 中文分词
    C++11:20weak_ptr弱引用的智能指针
    C++11:19unique_ptr独占的智能指针
    C++11:18shared_ptr共享的智能指针
    C++11:17可变参数模版和type_traits的综合应用
    C++11:16可变参数模板
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4249101.html
Copyright © 2011-2022 走看看