上一篇對easymock架構隻能對接口進行mock的認識是錯誤的,對于easymock架構隻能對接口進行mock來源于網上搜尋的結果,自己在看源代碼時也沒有認真看。今天特地看了一下才發現最新版本的easymock可以直接對類進行mock并不需要再導入其它jar檔案。
建立mock對象
建立的Mock對象有三種,分别是:strict、default、nice
//建立strict類型mock對象
final IMethods iMethods1 = EasyMock.createNiceMock(IMethods.class);
//建立strict類型mock對象
final IMethods iMethods2 = EasyMock.createMock(IMethods.class);
//建立strict類型mock對象
final IMethods iMethods3 = EasyMock.createStrictMock(IMethods.class);
當mock對象時為nice類型時,當mock調用的方法沒有錄制或調用的次數超過預設的調用次數時會傳回null
當mock對象時為default類型時,mock對象調用方法的順序無需mock對象錄制的順序一緻,但mock調用的方法沒有錄制或調用的次數超過預設的調用次數時會抛異常
當mock對象時為strict類型時,mock對象調用方法的順序必須和mock對象錄制的順序一緻,否則會抛異常
對接口建立Mock對象的時序圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TQNVzYtJGbo1WZ1ZkMkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM5MTN0ADNxITNxcDMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
主要是handler對象的建立過程,mockControl類中的createMock方法
public <T> T createMock(final Stringname, final Class<T> toMock, final ConstructorArgs constructorArgs,
final Method... mockedMethods) {
if (toMock.isInterface() && mockedMethods != null) {
throw new IllegalArgumentException("Partial mocking doesn't makesense for interface");
}
try {
//判斷目前狀态是不是記錄狀态,如果replay狀态就會抛出異常,建立mockControl對象時state初始化為RecordState
state.assertRecordState();
//如果要為接口建立mock對象,則采用java自帶的proxy類來建立代理對象,如果要為類建立mock對象,則采用cglib庫中的方法來建立代理對象
final IProxyFactory proxyFactory = toMock.isInterface()
? interfaceProxyFactory
: getClassProxyFactory();
//建立mock對象
return proxyFactory.createProxy(toMock, new ObjectMethodsFilter(toMock,
new MockInvocationHandler(this), name), mockedMethods, constructorArgs);
} catch (final RuntimeExceptionWrapper e) {
throw (RuntimeException) e.getRuntimeException().fillInStackTrace();
}
}
如果要mock的是接口,最終産生代理對象的是JavaProxyFactory類中的createProxy方法
public <T> T createProxy(Class<T> toMock, InvocationHandler handler,
Method[] mockedMethods, ConstructorArgs constructorArgs) {
return (T) Proxy.newProxyInstance(toMock.getClassLoader(), new Class[] { toMock }, handler);
}
可以看出最終還是調用java proxy類來産生代理對象的