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

posted on 2015-01-25 22:25  lnlvinso  阅读(655)  评论(0编辑  收藏  举报