EasyMock教程--入門指南

jopen 12年前發布 | 50K 次閱讀 EasyMock 單元測試

在過去,我會經常向你展示 EasyMock 是什么和怎樣使用它測試你的Java應用。基于這個目的,我將創建一個簡單的股票程序并使用 JUnit 和 EasyMock 庫測試。

在開始之前,讓我們先理解一下使用 EasyMock 的需求。加入,你在創建一個Android 移動應用用來獲取用戶股票檔案。你的應用需要使用股票市場服務從正式服務器來檢索股票價格(例如納斯達克)。

當你開始測試代碼的時候,你也許不會想要去使用真實股票市場服務器來獲取股票價格。相反,你也許希望來些虛擬價格數據。所以你需要模擬股票市場服務然后返回虛擬數據,而不去訪問真實服務器。

EasyMock 就是用來干這事的 -- 幫你模擬接口。你可以預定義一些模擬對象的行為,然后在測試代碼時使用模擬這些對象。因為你關心的是測試你的代碼邏輯而不是外在服務和對象。因此。

為了使之清晰,請看一下下面的代碼摘要:

StockMarket marketMock = EasyMock.createMock(StockMarket.class);
EasyMock.expect(marketMock.getPrice("EBAY")).andReturn(42.00);
EasyMock.replay(marketMock);

第一行,我們要求 EasyMock 創建一個服務于 StockMarket 接口的模擬對象。然后第二行,我們定義了這個虛擬對象的行為--例如當getPrice()對象被調用并傳遞 “EBAY” 參數時,模擬對象將返回 42.00 .然后我們調用 replay() 方法時,將使模擬對象備用。

這樣就差不錯關聯好了 EasyMock 的上下文了和它的基本使用。接下來將深入我們的證劵應用。

注意:點擊此處下載 Github 上的源碼   

證卷應用

我們的證券應用非常簡單。有一個 Stock 類來存儲股票名和數量,Portfolio 類來保存股票列表。Portfolio 類有一個方法用來計算證券的總價格。我們的類用 StockMarket 對象來檢索股票價格。當測試我們的代碼時,我們將使用 EasyMock 來模擬StockMarket。

Stock.java

package com.veerasundar.easymock;

public class Stock {

    private String name;
    private int quantity;

    public Stock(String name, int quantity) {
        this.name = name;
        this.quantity = quantity;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

}

StockMarket.java

用來模擬股票市場服務的接口。它包含一個通過給定股票名返回價格的方法。

package com.veerasundar.easymock;

public interface StockMarket {
    public Double getPrice(String stockName);
}

Portfolio.java

該對象包含了 Stock 對象列表和一個計算證券總價格的方法。它使用 StockMarket 對象來檢索股票價格。但是硬編碼依賴不是好的實踐,我們不應該在此就初始化 stockMarket 對象,我們應該在使用測試代碼的時候注入進來。

package com.veerasundar.easymock;

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

public class Portfolio {

    private String name;
    private StockMarket stockMarket;

    private List<Stock> stocks = new ArrayList<Stock>();

    /*
     * this method gets the market value for each stock, sums it up and returns
     * the total value of the portfolio.
     */
    public Double getTotalValue() {
        Double value = 0.0;
        for (Stock stock : this.stocks) {
            value += (stockMarket.getPrice(stock.getName()) * stock
                    .getQuantity());
        }
        return value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Stock> getStocks() {
        return stocks;
    }

    public void setStocks(List<Stock> stocks) {
        this.stocks = stocks;
    }

    public void addStock(Stock stock) {
        stocks.add(stock);
    }

    public StockMarket getStockMarket() {
        return stockMarket;
    }

    public void setStockMarket(StockMarket stockMarket) {
        this.stockMarket = stockMarket;
    }
}

至此,我們便完成了整個應用的編碼,接下來我們將測試 Portfolio.getTotalValue() 方法,因為那是我們的業務邏輯所在。

用 JUnit 與 EasyMock 測試 Portfolio 應用

PortfolioTest.java

package com.veerasundar.easymock.tests;

import junit.framework.TestCase;

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;

import com.veerasundar.easymock.Portfolio;
import com.veerasundar.easymock.Stock;
import com.veerasundar.easymock.StockMarket;

public class PortfolioTest extends TestCase {

    private Portfolio portfolio;
    private StockMarket marketMock;

    @Before
    public void setUp() {
        portfolio = new Portfolio();
        portfolio.setName("Veera's portfolio.");
        marketMock = EasyMock.createMock(StockMarket.class);
        portfolio.setStockMarket(marketMock);
    }

    @Test 
    public void testGetTotalValue() {

        /* = Setup our mock object with the expected values */
        EasyMock.expect(marketMock.getPrice("EBAY")).andReturn(42.00);
        EasyMock.replay(marketMock);

        /* = Now start testing our portfolio */
        Stock ebayStock = new Stock("EBAY", 2);
        portfolio.addStock(ebayStock);
        assertEquals(84.00, portfolio.getTotalValue());
    }

}

正如你所看到的,在 setUp() 調用時我們創建新的 Portfolio 對象。然后我們調用 EasyMock 要求為 StockMarket 接口創建一個模擬對象。然后我們使用 Portfolio.setStockMarket() 方法將這個對象注入到 Portfolio 對象。

@Tes t方法,我們使用以下代碼定義模擬對象的行為:

EasyMock.expect(marketMock.getPrice("EBAY")).andReturn(42.00);
EasyMock.replay(marketMock);

這樣一來,當 getPrice() 方法帶有 “EBAY” 的參數被調用的時候,將會返回42.00。

然后我們創建了一個數量為2的 ebayStock 股票,并將其添加到我們的 Portfolio 中。將我們設置 EBAY 價格為 42.00 時,我們便知道股票的總價格為 84.00(2*42.00)。在最后一行,我們使用 assertEquals() 進行了同樣的聲明。

如果 getTotalValue() 中代碼不出錯的話,以上測試應該會成功,否則測試將會失敗。

結論

以上便是如果使用 EasyMock 庫模擬外部服務/對象以及在測試代碼中使用的示例,EasyMock 能做的遠不止我在上面展示的。

原文鏈接 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!