大家好,又见面了,我是你们的朋友全栈君。
使用EasyMock的总体步骤
1、生成Mock接口
IService mockService = EasyMock.createMock("name", IService.class);
如果要mock对象,而不是接口,应该使用class extension:org.easymock.classextension.EasyMock
如果要mock多个接口,最好使用MockControl来管理:
IMocksControl control = EasyMock.createControl();
IService1 mockObj1 = control.createMock(IService1.class);
IService2 mockObj2 = control.createMock(Iservice2.class);
2、设置预期行为
如果返回值是void:
mockService.doVoidMethod();
EasyMock.expectLastCall();// 最新版本的EasyMock可以忽略此句
如果要求抛出异常:
EasyMock.expectLastCall().andThrow(
new MyException(new RuntimeException())).anyTimes();
如果返回值不是void:
EasyMock.expect(mockService.doSomething(isA(Long.class), isA(Report.class),
isNull(Report.class))).andReturn("return string").anyTimes();
上例方法中传入3个参数,分别是Long、Report、null——注意,如果参数是基本类型long,则使用EasyMock.anyLong()
传入参数还可以定义为具体的对象,而不是类。
3、将Mock对象切换到replay状态
EasyMock.replay(mockService);
如果是用MockControl来管理:
control.replay();
4、测试
bo.setService(mockService);
bo.doSomething();
5、验证Mock对象的行为
EasyMock.verify(mockService);
如果是用MockControl来管理:
control.verify();
expect()注意事项
期望传入参数为基本类型时
用expect来设置mock方法的期望调用方式时,如果使用到基本类型,但是又不要基本类型的值,
不能用:EasyMock.isA(Long.class)
要用:EasyMock.anyLong()
期望传入参数可能为null时
如果传入的参数可能为null,如果用
isA(String.class)
而实际传入的是null,则会报错 (isA(java.lang.String), <any>): expected: 1, actual: 0
应该用:
or(isA(String.class), isNull())
如果返回结果在运行时才能确定
很可能某个方法期望的返回结果不是固定的,例如根据传入参数不同而不同;这时需要使用andAnswer():
EasyMock.expect(mockService.execute(EasyMock.anyInt())).andAnswer(new IAnswer<Integer>() {
public Integer answer() throws Throwable {
Integer count = (Integer) EasyMock.getCurrentArguments()[0];
return count * 2;
}
});
注意,通过EasyMock.getCurrentArguments()可以获取传入参数!
times()
常见问题
java.lang.IllegalStateException: 2 matchers expected, 1 recorded.
可能是设置mock方法的期望调用方式时,既使用了isA的方式来指定参数,又使用了一个具体值来作为参数
比如这样写:
expect(mockEmployeeRepository.findByDepartmentAndSpecification("HR",
isA(EmployeeSearchSpecification.class)).andReturn(emplooyees);
正确的写法:
——用eq(具体值)
expect(mockEmployeeRepository.findByDepartmentAndSpecification(eq("HR"),
isA(EmployeeSearchSpecification.class)).andReturn(employees);
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128679.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...