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