EasyMock教學


Mocking是什麼?

Mocking是一種在隔離測試一個類的功能。例如,無需資料庫連線或屬性檔案中讀取或檔案伺服器上讀取需要測試的功能。 mock物件做實服務的嘲諷。一個mock物件返回對應於傳遞給它一些虛擬輸入無效資料。

EasyMock

EasyMock便於無縫地建立模擬物件。它使用Java反射,以創造為給定介面的模擬物件。模擬物件是什麼,只不過是代理的實際實現。考慮如:股票服務的情況下,它返回一個股票價格的詳細資訊。在開發過程中,實際的庫存服務不能被用於獲得實時資料。因此,我們需要一個虛擬的股票實施服務。簡易模擬可以很容易理解顧名思義這樣。

EasyMock的好處

  • 不用手寫 -  沒有必要通過自己編寫的模擬物件。

  • 重構安全 - 重構介面方法的名稱或重新排序的引數不會破壞測試程式碼在執行時建立。

  • 返回值支援 - 支援返回值。

  • 異常支援 - 支援例外/異常。

  • 命令檢查支援 - 支援檢查命令方法呼叫。

  • 注釋支援 - 支援使用註解建立。

考慮下面的程式碼片段。

package com.yiibai.mock;

import java.util.ArrayList;
import java.util.List;

import org.easymock.EasyMock;

public class PortfolioTester {
   public static void main(String[] args){

      //Create a portfolio object which is to be tested		
      Portfolio portfolio = new Portfolio();

      //Creates a list of stocks to be added to the 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);		

      //Create the mock object of stock service
      StockService stockServiceMock = EasyMock.createMock(StockService.class);

      //mock the behavior of stock service to return the value of various stocks
      EasyMock.expect(stockServiceMock.getPrice(googleStock)).andReturn(50.00);
      EasyMock.expect(stockServiceMock.getPrice(microsoftStock)).andReturn(1000.00);

      EasyMock.replay(stockServiceMock);
      //add stocks to the portfolio
      portfolio.setStocks(stocks);
      //set the stockService to the portfolio
      portfolio.setStockService(stockServiceMock);

      double marketValue = portfolio.getMarketValue();

      //verify the market value to be 10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
      System.out.println("Market value of the portfolio: "+ marketValue);
   }
}

讓我們來了解上述程式的重要概念。完整的程式碼在第一個應用。

  • Portfolio  - 進行股票名單,並獲得用股票價格和股票數量計算的市場價值的物件。

  • Stock  - 攜帶一只股票的詳細資訊,如它的id,名稱,數量等的物件

  • StockService - 股票的服務介面,其功能是返回一個股票的當前價格。

  • EasyMock.createMock(...)  - EasyMock股票建立了服務的模擬

  • EasyMock.expect(...).andReturn(...) - 模擬實現StockService介面用getPrice方法。對於googleStock,回到50.00的價格。

  • EasyMock.replay(...) - EasyMock準備模擬物件,以便它可以被用於測試目的。

  • portfolio.setStocks(...) - 現在的投資組合包含了兩隻股票列表。

  • portfolio.setStockService(...) - 分配的StockService模擬物件來組合。

  • portfolio.getMarketValue() - 基於使用的模擬股票服務公司的股票投資組合回報的市場價值。