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
来源:https://www.cnblogs.com/lnlvinso/p/4249101.html