在easymock中,通常我们使用一下的代码来创建mock对象
IMyInterface mock
=
createStrictMock(IMyInterface.
class
);
replay(mock);
verify(mock);
reset(mock);
replay(mock);
verify(mock);
reset(mock);
如果需要mock多个对象,则需要如此:
IMyInterface1 mock1
=
createStrictMock(IMyInterface1.
class
);
IMyInterface2 mock2 = createStrictMock(IMyInterface2. class );
IMyInterface3 mock3 = createStrictMock(IMyInterface2. class );
...
replay(mock1, mock2, mock3, ...);
verify(mock1, mock2, mock3, ...);
reset(mock1, mock2, mock3, ...);
IMyInterface2 mock2 = createStrictMock(IMyInterface2. class );
IMyInterface3 mock3 = createStrictMock(IMyInterface2. class );
...
replay(mock1, mock2, mock3, ...);
verify(mock1, mock2, mock3, ...);
reset(mock1, mock2, mock3, ...);
不仅需要为每个mock对象增加create语句,而且需要为这个新增的mock对象更新replay()/verify()/reset()方法,比较啰嗦,而且容易出错。
这种情况下可以考虑使用MocksControl来简化代码:
IMocksControl mocksControl
=
createControl();
IMyInterface1 mock1 = mocksControl.createMock(IMyInterface1. class );
IMyInterface2 mock2 = mocksControl.createMock(IMyInterface2. class );
IMyInterface3 mock3 = mocksControl.createMock(IMyInterface3. class );
...
mocksControl.replay();
mocksControl.verify();
mocksControl.reset();
IMyInterface1 mock1 = mocksControl.createMock(IMyInterface1. class );
IMyInterface2 mock2 = mocksControl.createMock(IMyInterface2. class );
IMyInterface3 mock3 = mocksControl.createMock(IMyInterface3. class );
...
mocksControl.replay();
mocksControl.verify();
mocksControl.reset();
IMocksControl接口容许创建多个mock对象,这些创建的对象自动关联到这个mocksControl实例上,以后再调用replay()/verify()/reset()时就不需要逐个列举出每个mock对象。当mock对象比较多,尤其是原有代码上新增mock 对象时非常方便。
事实上,Easymock.createMock()方法内部实现也是使用IMocksControl的:
public
static
<
T
>
T createMock(
final
Class
<
T
>
toMock)
{
return createControl().createMock(toMock);
}
public static IMocksControl createControl() {
return new MocksControl(MocksControl.MockType.DEFAULT);
}
return createControl().createMock(toMock);
}
public static IMocksControl createControl() {
return new MocksControl(MocksControl.MockType.DEFAULT);
}
除了使用方便外,使用IMocksControl还有另外一个重要的好处,就是如果使用strict control,则可以跨多个mock对象检测方法的调用顺序,具体的内容请参考本教程中的"strict和nice"一文。