EasyMock教程–入門

在本文中,我將向您展示EasyMock是什么,以及如何使用它來測試Java應用程序。 為此,我將創建一個簡單的Portfolio應用程序,并使用JUnit&EasyMock庫對其進行測試。

在開始之前,讓我們首先了解使用EasyMock的需求。 可以說,您正在構建一個Android移動應用程序來維護用戶的股票投資組合。 您的應用程序將使用股票市場服務從真實服務器(例如NASDAQ)檢索股票價格。

在測試代??碼時,您不想在真正的股票市場服務器上獲取股票價格。 相反,您需要一些虛擬價格值。 因此,您需要模擬不返回真實服務器值即可返回虛擬值的股市服務。

EasyMock確實在做同樣的事情–幫助您模擬界面。 您可以預定義模擬對象的行為,然后在代碼中使用該模擬對象進行測試。 因為,您只關心測試 你的邏輯 而不是外部服務或對象。 因此,模擬外部服務很有意義。

為了清楚起見,請看下面的代碼摘錄(我們將在一段時間內看到完整的代碼):

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

在第一行中,我們要求EasyMock為我們的StockMarket接口創建一個模擬對象。 然后在第二行中,定義該模擬對象的行為–即,當使用參數“ EBAY”調用getPrice()方法時,該模擬對象應返回42.00 。 然后,我們調用replay()方法,以使模擬對象可以使用。

因此,這幾乎為EasyMock及其用法設置了上下文。 讓我們深入研究Portfolio應用程序。 您可以從Github下載完整的源代碼。

投資組合申請

我們的投資組合應用程序非常簡單。 它有一個Stock類代表股票名稱和數量,而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

表示股票市場服務的接口。 它具有一種返回給定股票名稱的股票價格的方法。

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應用程序如果您以前從未使用過JUnit,那么現在是開始使用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()期間,我們正在創建新的Portfolio對象。 然后,我們要求EasyMockStockMarket接口創建一個模擬對象。 然后,使用Portfolio.setStockMarket()方法將此模擬對象注入到投資組合對象中。

@Test方法中,我們使用以下代碼定義模擬對象在調用時的行為:

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

因此,在我們的模擬對象的getPrice方法之后 EBAY調用時將返回42.00

然后,我們將創建2個數量的ebayStock ,并將其添加到我們的投資組合中。 由于我們將EBAY的股價設置為42.00,因此我們知道投資組合的總價值為84.00(即2 x 42.00)。 在最后一行,我們使用JUnit assertEquals()方法聲明相同的內容。

如果我們在getTotalValue()代碼中沒有犯任何錯誤,則上述測試應成功運行。 否則,測試將失敗。

結論

因此,這就是我們使用EasyMock庫模擬外部服務/對象并在我們的測試代碼中使用它們的方式。 EasyMock可以做的比我在本文中顯示的要多。 我可能會在下一篇文章中嘗試介紹一些高級用法方案。

參考: EasyMock教程– Veera Sundar博客上的JCG合作伙伴 Veera Sundar 入門 。


翻譯自: https://www.javacodegeeks.com/2012/07/easymock-tutorial-getting-started.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

synchronized內置鎖

synchronized內置鎖&#xff0c;如果發生阻塞&#xff0c;無法被中斷&#xff0c;除非關閉jvm.因此不能從死鎖中恢復。轉載于:https://www.cnblogs.com/paulbai/p/6163250.html

如何加快Json 序列化?有哪些方法?

1、使用阿里的fastjson 2、可以通過去除不必要屬性加快序列化。如person對象&#xff0c;有id&#xff0c;name&#xff0c;address&#xff0c;我json需要用戶姓名&#xff0c;此時序列化的時候就只序列化name&#xff0c;id和address不序列化。轉載于:https://www.cnblogs.co…

用金萬維怎么設置路由器_家用路由器怎么設置 家庭路由器設置方法【圖文】...

這里以TP-link的無線路由器為例&#xff0c;教一下怎么調試路由器上網。準備工具:網線兩條&#xff0c;電腦或者手機&#xff0c;用手機的話就不需要用網線了1、用網線連接光纖貓與路由器&#xff0c;光貓的LAN1口與路由器的WAN相連。路由器的LAN任意一個口用網線連接電腦。2、…

Liferay –簡單主題開發

實際上&#xff0c;Liferay的6.1版本已經走了很長一段路&#xff0c;該版本完全支持JSF和IceFaces。 我的目標是使它成為我們團隊中的標準協作工具&#xff0c;因此我仍在嘗試學習它的精髓。 好的軟件應用程序可以解決問題&#xff0c;但是好的軟件應用程序不僅可以解決問題&am…

springmvc初步配置

導包/添加依賴&#xff1a;<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springfram…

獲取用戶地理位置

1、利用h5 屬性獲取用戶地理位置 h5的新增屬性是支持用戶獲取地理位置的特別是手機&#xff0c;支持的情況會更好。具體寫法如下 // 定位功能getLocation () {if (navigator.geolocation) {navigator.geolocation.getCurrentPosition(showPosition, showError);} else {alert(瀏…

行號 設置vim_在VSCode里面配置Vim正確姿勢(細節解析)

一、導論對于不用vim的人來說&#xff0c;vim簡直是個噩夢&#xff0c;復雜的指令、丑陋的界面、令人頭痛的配置文件&#xff0c;任何一項都足以勸退一大波人&#xff0c;但是對于已經習慣了使用vim的人來說&#xff0c;vim簡直就是馬良神筆&#xff0c;似乎vim除了生孩子什么都…

使用Spring 3 MVC處理表單驗證

本文是有關Spring 3的系列文章的一部分。該系列的早期文章是使用Spring 3 MVC的Hello World和使用Spring 3 MVC的 Handling Forms 。 現在讓我們更深入地研究Spring。 在本文中&#xff0c;我們將學習驗證從表單中獲取的數據。 讓我們更仔細地看一下驗證任務。 場景1 &#xf…

當事人角色 變更映射策略引起的問題

IBeamMDAA V2版本中&#xff0c;由于變更了 當事人角色 的繼承機制&#xff0c;在添加 當事人角色時&#xff0c;為了 構建 當事人-當事人角色之間的關系&#xff0c;代碼如下&#xff1a;//if (party.PartyRoles ! null && !party.PartyRoles.Contains(sysUser))//{//…

vs xxxxx nuget配置無效

重啟vs轉載于:https://www.cnblogs.com/zinan/p/7080668.html

巡回沙龍_美浮特全國巡回沙龍第一期結束撒花!

科技美膚&#xff0c;無齡煥變。美浮特2019全國美膚巡回沙龍第一期活動圓滿結束&#xff01;優秀的小伙伴&#xff0c;雅致的茶歇環境&#xff0c;精美的甜點小食&#xff0c;理論與體驗并行的膚感測試課堂……不知道是哪一個環節給大家留下了深刻的印象呢&#xff1f;首先讓我…

Spring與網關的集成

這是有關Spring Integration系列的第二篇文章。 本文以我們介紹Spring Integration的第一篇文章為基礎。 上下文設置 在第一篇文章中&#xff0c;我們創建了一個簡單的Java應用程序&#xff0c;其中 通過頻道發送了一條消息&#xff0c; 它被服務&#xff08;即POJO&#xf…

UIAutomation識別UI元素

MS UI Automation&#xff08;Microsoft User Interface Automation&#xff1a;UIA&#xff09;是隨.net framework3.0一起發布的&#xff0c;雖然在如今這個幾乎每天都有各種新名詞、新技術出來的所謂的21世紀&#xff0c;它顯得已經有些過時了。前些日子&#xff0c;正好一個…

【C++第一個Demo】---控制臺RPG游戲3【登陸菜單樹】

【登陸系統--樹結構】 1 首先我這里設計&#xff0c;由一個基類MainMenu構建樹結構&#xff0c;并實現控制臺上菜單之間的切換和返回操作 1 #ifndef _UI_BASE_H_2 #define _UI_BASE_H_3 4 #include <string>5 #include <vector>6 #include"..//Marco.h"7…

不存在_施文忠 | ”存在“與“不存在”——巴蜀文明概論

海德格爾有句名言&#xff1a;“存在者存在&#xff0c;不存在者不存在&#xff01;”四川&#xff0c;一個偉大的存在&#xff0c;偏偏存在于四川的口頭禪卻是“不存在”。在不存在中追求存在&#xff0c;在存在中擺脫存在。六月白鹿鎮&#xff0c;書院學習了《李白與海德格爾…

Spring和JSF集成:異常處理

大多數JSF開發人員都會熟悉“發生錯誤”頁面&#xff0c;當在他們的代碼某處引發意外異常時&#xff0c;該頁面就會顯示。 該頁面在開發時確實很有用&#xff0c;但對于生產應用程序通常不是您想要的。 通常&#xff0c;在用庫存JSF替換此頁面時&#xff0c;您有兩種選擇。 您可…

Altium 原理圖出現元件“Extra Pin…in Normal of part ”警告的解決方法

轉載于&#xff1a; http://blog.csdn.net/idoming/article/details/45575627 使用Altium Designer的時候編譯完后&#xff0c;只關注過錯誤沒有關注過警告&#xff0c;現在認真排查一下有哪些警告。 正在進行的項目原理圖編譯完成后提示標題中的警告信息。經過在網上搜索&…

XidianOJ 1087 浪漫的V8

題目描述 V8為了討女朋友開心&#xff0c;給lx承包大活后面那個水塘。為了籌集資金&#xff0c;V8偷偷地溜進了一座古墓&#xff0c;發現在他面前有金光閃閃的若干小箱子&#xff0c;里面全都是金粉&#xff0c;作為橫行于各種#&#xffe5;&場所的V8來說&#xff0c;辨別不…

curl php 模擬來源_php 使用curl模擬ip和來源進行訪問的實現方法

對于限制了ip和來源的網站&#xff0c;使用正常的訪問方式是無法訪問的。本文將介紹一種方法&#xff0c;使用php的curl類實現模擬ip和來源&#xff0c;訪問那些限制了ip和來源的網站。1.設置頁面限制ip和來源訪問server.php$client_ip getip();$referer getreferer();$allow…

堆棧C語言實現

堆棧的抽象數據類型描述&#xff1a; 類型名稱&#xff1a; 堆棧&#xff08;Stack&#xff09;。數據對象集&#xff1a; 一個有 0 個或多個元素的又窮表。操作集&#xff1a; 長度為 max_size 的堆棧 S ∈ Stack&#xff0c; 堆棧元素 item ∈ ElementType。stack creatc_sta…