參考案例:(本位使用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/