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。