EasyMock教程--入門指南

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

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

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

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

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

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

 
  1. 1 StockMarket marketMock = EasyMock.createMock(StockMarket.class);    
  2.  
  3. 2 EasyMock.expect(marketMock.getPrice("EBAY")).andReturn(42.00);    
  4.  
  5. 3 EasyMock.replay(marketMock);   

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

這樣就差不錯關聯好了 EasyMock 的上下文了和它的基本使用。接下來將深入我們的證?揮τ謾?/p>

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

證卷應用

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

Stock.java

  1. package com.veerasundar.easymock;         
  2.  
  3.  public class Stock {    
  4.      
  5.     private String name;  
  6.  
  7.     private int quantity;    
  8.  
  9.     public Stock(String name, int quantity) {    
  10.  
  11.         this.name = name;    
  12.  
  13.         this.quantity = quantity;    
  14.  
  15.     }      
  16.  
  17.      public String getName() {    
  18.  
  19.         return name;    
  20.  
  21.      }        
  22.  
  23.      public void setName(String name) {    
  24.  
  25.          this.name = name;    
  26.  
  27.      }         
  28.  
  29.      public int getQuantity() {    
  30.  
  31.         return quantity;    
  32.  
  33.     }    
  34.       
  35.      public void setQuantity(int quantity) {    
  36.  
  37.          this.quantity = quantity;    
  38.  
  39.      }        
  40.  }   

StockMarket.java

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

 

  1. package com.veerasundar.easymock;         
  2.  
  3.  public interface StockMarket {     
  4.      public Double getPrice(String stockName);    
  5. }   

 

Portfolio.java

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

 

  1. package com.veerasundar.easymock;    
  2.         
  3.  import java.util.ArrayList;     
  4.  import java.util.List;           
  5.  
  6.  public class Portfolio {    
  7.       
  8.      private String name;     
  9.      private StockMarket stockMarket;            
  10.      private List<Stock> stocks = new ArrayList<Stock>();          
  11.  
  12.      /*     
  13.       * this method gets the market value for each stock, sums it up and returns     
  14.       * the total value of the portfolio.     
  15.       */   
  16.  
  17.     public Double getTotalValue() {    
  18.          Double value = 0.0;     
  19.         for (Stock stock : this.stocks) {    
  20.               value += (stockMarket.getPrice(stock.getName()) * stock    
  21.                       .getQuantity());     
  22.          }     
  23.          return value;     
  24.      }    
  25.         
  26.      public String getName() {    
  27.  
  28.          return name;    
  29.  
  30.     }          
  31.  
  32.     public void setName(String name) {    
  33.  
  34.          this.name = name;    
  35.  
  36.     }    
  37.         
  38.     public List<Stock> getStocks() {     
  39.          return stocks;     
  40.     }    
  41.  
  42.        
  43.      public void setStocks(List<Stock> stocks) {    
  44.  
  45.         this.stocks = stocks;    
  46.  
  47.      }    
  48.  
  49.       
  50.      public void addStock(Stock stock) {    
  51.  
  52.          stocks.add(stock);    
  53.  
  54.      }    
  55.  
  56.       
  57.      public StockMarket getStockMarket() {    
  58.  
  59.         return stockMarket;    
  60.  
  61.    }    
  62.  
  63.     
  64.      public void setStockMarket(StockMarket stockMarket) {    
  65.  
  66.          this.stockMarket = stockMarket;    
  67.  
  68.      }    
  69.  
  70.  }   

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

用 JUnit 與 EasyMock 測試 Portfolio 應用

PortfolioTest.java

 

  1. package com.veerasundar.easymock.tests;  
  2.  
  3. import junit.framework.TestCase;  
  4.  
  5. import org.easymock.EasyMock;  
  6. import org.junit.Before;  
  7. import org.junit.Test;  
  8.  
  9. import com.veerasundar.easymock.Portfolio;  
  10. import com.veerasundar.easymock.Stock;  
  11. import com.veerasundar.easymock.StockMarket;  
  12.  
  13. public class PortfolioTest extends TestCase {  
  14.  
  15.     private Portfolio portfolio;  
  16.     private StockMarket marketMock;  
  17.  
  18.     @Before 
  19.     public void setUp() {  
  20.         portfolio = new Portfolio();  
  21.         portfolio.setName("Veera's portfolio.");  
  22.         marketMock = EasyMock.createMock(StockMarket.class);  
  23.         portfolio.setStockMarket(marketMock);  
  24.     }  
  25.  
  26.     <A href="http://my.oschina.net/test45" rel=nofollow target=_blank>@Test</A>   
  27.     public void testGetTotalValue() {  
  28.  
  29.         /* = Setup our mock object with the expected values */ 
  30.         EasyMock.expect(marketMock.getPrice("EBAY")).andReturn(42.00);  
  31.         EasyMock.replay(marketMock);  
  32.  
  33.         /* = Now start testing our portfolio */ 
  34.         Stock ebayStock = new Stock("EBAY"2);  
  35.         portfolio.addStock(ebayStock);  
  36.         assertEquals(84.00, portfolio.getTotalValue());  
  37.     }  
  38.  
  39. }  
如你所看到的,在 setUp() 調用時我們創建新的 Portfolio 對象。 然後我們調用 EasyMock 要求為 StockMarket 介面創建一個模擬對象。 然後我們使用 Portfolio.setStockMarket() 方法將這個對象注入到 Portfolio 對象。

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

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

 

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

然後我們創建了一個數量為2的 ebayStock 股票,並將其添加到我們的 Portfolio 中。

將我們設置 EBAY 價格為 42.00 時,我們便知道股票的總價格為 84.00(2*42.00)。

在最後一行,我們使用 assertEquals() 進行了同樣的聲明。

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

結論

以上便是如果使用 EasyMock 庫模擬外部服務/對象以及在測試代碼中使用的示例,

EasyMock 能做的遠不止我在上面展示的,點擊這裡了解更多關於 EasyMock 的信息

 






[火星人 ] EasyMock教程--入門指南已經有387次圍觀

http://coctec.com/docs/linux/show-post-65142.html