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.mzph.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…