天天看點

easymock學習筆記(2)--mock對象建立過程

上一篇對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對象的時序圖

easymock學習筆記(2)--mock對象建立過程

主要是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類來産生代理對象的

繼續閱讀