天天看點

EasyMock 簡單使用

參考案例:(本位使用markdown編寫)
https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/
https://www.yiibai.com/easymock/
git.oschina執行個體:https://gitee.com/lhhTestTool/LhhEasyMock


# LhhEasyMock
# EasyMock   
EasyMock便于無縫地建立模拟對象。它使用Java反射,以創造為給定接口的模拟對象。模拟對象是什麼,隻不過是代理的實際實作。
考慮如:股票服務的情況下,它傳回一個股票價格的詳細資訊。在開發過程中,實際的庫存服務不能被用于獲得實時資料。
是以,我們需要一個虛拟的股票實施服務。簡易模拟可以很容易了解顧名思義這樣


# EasyMock的好處
* 不用手寫 -  沒有必要通過自己編寫的模拟對象。
* 重構安全 - 重構接口方法的名稱或重新排序的參數不會破壞測試代碼在運作時建立。
* 傳回值支援 - 支援傳回值。
* 異常支援 - 支援例外/異常。
* 指令檢查支援 - 支援檢查指令方法調用。
* 注釋支援 - 支援使用注解建立。

# EasyMock架包

        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>RELEASE</version>
        </dependency>




# 階段介紹

## 資料準備階段
```
        //建立一個要測試的組合對象
        Portfolio portfolio = new Portfolio();

        //建立将要添加到組合中的資料(股票)清單。
        List<Stock> stocks = new ArrayList<Stock>();
        Stock googleStock = new Stock("1","Google", 10);
        Stock microsoftStock = new Stock("2","Microsoft",100);

        stocks.add(googleStock);
        stocks.add(microsoftStock);

```

## Record 階段
```

        // Mock的Record 階段  -》 在這個階段,Record 狀态,使用者可以設定 Mock 對象的預期行為和輸出,這些對象行為被錄制下來,儲存在 Mock 對象中
                //建立提供資料(股票)服務的模拟對象
        StockService stockService = EasyMock.createMock(StockService.class);

        //模拟資料(股票)服務的行為,以傳回各種方法的價值。設定return的傳回值
        EasyMock.expect(stockService.getPrice(googleStock)).andReturn(50.00);
        EasyMock.expect(stockService.getPrice(microsoftStock)).andReturn(1000.00);

```

## Replay  階段 
   `replay()`,将 Mock 對象的狀态置為 `Replay 狀态`。
```
        //Mock的Replay  階段  -》 在這個階段,在使用 Mock 對象進行實際的測試前,我們需要将 Mock 對象的狀态切換為 Replay。在 Replay 狀态,Mock 對象能夠根據設定對特定的方法調用作出預期的響應。
        EasyMock.replay(stockService);
        //在業務處理組合中增加資料項
        portfolio.setStocks(stocks);
        //在業務處理組合中增加資料服務
        portfolio.setStockService(stockService);

```

## 測試調用階段

```
        //實際處理邏輯
        double marketValue = portfolio.getMarketValue();

        //驗證資料處理 10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
        System.out.println("Market value of the portfolio: "+ marketValue);

```


## EasyMock 驗證階段(非必須)
```
        //Mock的驗證階段 (驗證調用過程正常完成)
        EasyMock.verify(stockService);
```


# EasyMock 方法彙總

## EasyMock
    建構和初始化  
    
 
1.EasyMock靜态方法createMock 
> 使用 EasyMock 動态建構 Mock 對象

2.EasyMock靜态方法createControl
> 能建立一個接口 IMocksControl 的對象,該對象能建立并管理多個 Mock 對象。
如果需要在測試中使用多個 Mock 對象,我們推薦您使用這一機制,
因為它在多個 Mock 對象的管理上提供了相對便捷的方法。

> 如果您要模拟的是一個具體類而非接口,那麼您需要下載下傳擴充包 `EasyMock Class Extension 2.2.2`。
在對具體類進行模拟時,您隻要用 `org.easymock.classextension.EasyMock` 類中的靜态方法代替 `org.easymock.EasyMock` 類中的靜态方法即可。

3,replay(mockResultSet) or replay();
> 将 Mock 對象切換到 Replay 狀态

兩種使用方式:  
eg
    1.如果建構對象`IMocksControl`則調用它的`.replay()`;   
    2.如果建構對象為具體的我們業務測試對象,則調用`EasyMock.replay(xxx);`(本例調用這個)

4.verify(mockResultSet) or verify();
> 對 Mock 對象的行為進行驗證

兩種使用方式:  
eg
    1.如果建構對象`IMocksControl`則調用它的`.verify()`;   
    2.如果建構對象為具體的我們業務測試對象,則調用`EasyMock.verify(xxx);`(本例調用這個)

5.reset 
> 為了避免生成過多的 Mock 對象,EasyMock 允許對原有 Mock 對象進行重用。要對 Mock 對象重新初始化,我們可以采用 reset 方法

兩種使用方式:  
eg
    1.如果建構對象`IMocksControl`則調用它的`.reset ()`;   
    2.如果建構對象為具體的我們業務測試對象,則調用`EasyMock.reset (xxx);`(本例調用這個)





# IExpectationSetters
    對 Mock 對象行為的添加和設定是通過接口 IExpectationSetters 來實作的   
    兩種類型的輸出:(1)産生傳回值;(2)抛出異常。  
    
1.IExpectationSetters<T> andReturn(T value);
> 設定傳回值

2.void andStubReturn(T value);
> 有時,某個方法的調用總是傳回一個相同的值,為了避免每次調用都為 Mock 對象的行為進行一次設定

3.IExpectationSetters<T> andThrow(Throwable throwable);
> 設定預期抛出異常

4.void andStubThrow(Throwable throwable);
> 設定抛出預設異常的函數 與 `andStubReturn` 類似

5.IExpectationSetters<T> times(int count);
> 該方法可以 Mock 對象方法的調用次數進行确切的設定  

eg:  
    `andReturn("My return value").times(3);`

6. times(int minTimes, int maxTimes)
> 該方法最少被調用 minTimes 次,最多被調用 maxTimes 次

7.atLeastOnce()
> 該方法至少被調用一次。

8. anyTimes()
> 該方法可以被調用任意次。

eg:
    `expect(mockResult.close()).times(3, 5);`


9.其他方式 參考文章

    https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/
    https://www.yiibai.com/easymock/










      

知識隻有共享才能傳播,才能推崇出新的知識,才能學到更多,這裡寫的每一篇文字/部落格,基本都是從網上查詢了一下資料然後記錄下來,也有些是原滋原味搬了過來,也有時加了一些自己的想法