EasyMock教程–入门
在開始之前,讓我們首先了解使用EasyMock的需求。 可以說,您正在構(gòu)建一個Android移動應(yīng)用程序來維護用戶的股票投資組合。 您的應(yīng)用程序?qū)⑹褂霉善笔袌龇?wù)從真實服務(wù)器(例如NASDAQ)檢索股票價格。
在測試代??碼時,您不想在真正的股票市場服務(wù)器上獲取股票價格。 相反,您需要一些虛擬價格值。 因此,您需要模擬不返回真實服務(wù)器值即可返回虛擬值的股市服務(wù)。
EasyMock確實在做同樣的事情–幫助您模擬界面。 您可以預(yù)定義模擬對象的行為,然后在代碼中使用該模擬對象進行測試。 因為,您只關(guān)心測試 你的邏輯 和 而不是外部服務(wù)或?qū)ο蟆?因此,模擬外部服務(wù)很有意義。
為了清楚起見,請看下面的代碼摘錄(我們將在一段時間內(nèi)看到完整的代碼):
StockMarket marketMock = EasyMock.createMock(StockMarket.class); EasyMock.expect(marketMock.getPrice('EBAY')).andReturn(42.00); EasyMock.replay(marketMock);在第一行中,我們要求EasyMock為我們的StockMarket接口創(chuàng)建一個模擬對象。 然后在第二行中,定義該模擬對象的行為–即,當(dāng)使用參數(shù)“ EBAY”調(diào)用getPrice()方法時,該模擬對象應(yīng)返回42.00 。 然后,我們調(diào)用replay()方法,以使模擬對象可以使用。
因此,這幾乎為EasyMock及其用法設(shè)置了上下文。 讓我們深入研究Portfolio應(yīng)用程序。 您可以從Github下載完整的源代碼。
投資組合申請
我們的投資組合應(yīng)用程序非常簡單。 它有一個Stock類代表股票名稱和數(shù)量,而Portfolio類則代表股票清單。 此投資組合類具有一種計算投資組合總價值的方法。 我們的類使用StockMarket (接口)對象檢索股票價格。 在測試我們的代碼時,我們將使用EasyMock模擬此StockMarket 。
股票.java
一個非常簡單的普通舊Java對象(PO??JO),用來表示單個股票。
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
表示股票市場服務(wù)的接口。 它具有一種返回給定股票名稱的股票價格的方法。
package com.veerasundar.easymock;public interface StockMarket {public Double getPrice(String stockName);}Portfolio.java
該對象包含一個Stock對象列表以及一種計算投資組合總價值的方法。 它使用StockMarket對象檢索股票價格。 由于對依賴項進行硬編碼不是一種好習(xí)慣,因此我們尚未初始化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;}}因此,現(xiàn)在我們已經(jīng)對整個應(yīng)用程序進行了編碼。 在此,我們將測試Portfolio.getTotalValue()方法,因為這是我們的業(yè)務(wù)邏輯所在。 使用JUnit和EasyMock測試Portfolio應(yīng)用程序如果您以前從未使用過JUnit,那么現(xiàn)在是開始使用JUnit的好時機。
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;@Beforepublic void setUp() {portfolio = new Portfolio();portfolio.setName('Veera's portfolio.');marketMock = EasyMock.createMock(StockMarket.class);portfolio.setStockMarket(marketMock);}@Testpublic 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()期間,我們正在創(chuàng)建新的Portfolio對象。 然后,我們要求EasyMock為StockMarket接口創(chuàng)建一個模擬對象。 然后,使用Portfolio.setStockMarket()方法將此模擬對象注入到投資組合對象中。
在@Test方法中,我們使用以下代碼定義模擬對象在調(diào)用時的行為:
EasyMock.expect(marketMock.getPrice('EBAY')).andReturn(42.00); EasyMock.replay(marketMock);因此,在我們的模擬對象的getPrice方法之后 用EBAY調(diào)用時將返回42.00 。
然后,我們將創(chuàng)建2個數(shù)量的ebayStock ,并將其添加到我們的投資組合中。 由于我們將EBAY的股價設(shè)置為42.00,因此我們知道投資組合的總價值為84.00(即2 x 42.00)。 在最后一行,我們使用JUnit assertEquals()方法聲明相同的內(nèi)容。
如果我們在getTotalValue()代碼中沒有犯任何錯誤,則上述測試應(yīng)成功運行。 否則,測試將失敗。
結(jié)論
因此,這就是我們使用EasyMock庫模擬外部服務(wù)/對象并在我們的測試代碼中使用它們的方式。 EasyMock可以做的比我在本文中顯示的要多。 我可能會在下一篇文章中嘗試介紹一些高級用法方案。
參考: EasyMock教程– Veera Sundar博客上的JCG合作伙伴 Veera Sundar 入門 。
翻譯自: https://www.javacodegeeks.com/2012/07/easymock-tutorial-getting-started.html
總結(jié)
以上是生活随笔為你收集整理的EasyMock教程–入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Profile模式示例
- 下一篇: 鱼缸水腥味重怎么回事(鱼缸水有很大腥味的