easymock教程_EasyMock教程–入门

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

easymock教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 函数、面向对象

一、函数 1、定义个函数&#xff0c;可以对输入的数据进行排序&#xff0c; 通过参数来决定是正向排序还是反向排序。 number input(请输入一串数字&#xff1a;) number_list list(number) def sort_number(*args, s0): if s 0: number_map map(int,args)result sorted…

Spark数据倾斜解决方案(转)

本文转发自技术世界&#xff0c;原文链接 http://www.jasongj.com/spark/skew/ Spark性能优化之道——解决Spark数据倾斜&#xff08;Data Skew&#xff09;的N种姿势 发表于 2017-02-28 | 更新于 2017-10-17 | 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解…

JavaParser入门:以编程方式分析Java代码

我最喜欢的事情之一是解析代码并对其执行自动操作。 因此&#xff0c;我开始为JavaParser做出贡献&#xff0c;并创建了两个相关项目&#xff1a; java-symbol-solver和Effectivejava 。 作为JavaParser的贡献者&#xff0c;我反复阅读了一些非常类似的问题&#xff0c;这些问…

python Django基本介绍

创建Django项目并运行 实验环境&#xff1a; Ubuntu 16.04下安装好Anaconda3 Windows下安装好PyCharm 实验步骤 一、创建django工程 在Ubuntu 16.04下执行下面的命令。 &#xff08;1&#xff09;创建一个python3的虚拟环境&#xff08;如果已经创建&#xff0c;忽略此步&…

Android 热补丁动态修复框架小结

Android 热补丁动态修复框架小结转载于:https://www.cnblogs.com/zhujiabin/p/7923233.html

C语言中关于结构体的理解

在c语言中我们如果需要去表示一个学生的特征&#xff0c;例如名字年龄成绩&#xff0c;这些信息我们就需要用到结构体来描述了。 struct stu{char name[20]; //姓名int age; //年龄float score; //成绩 }; struct(结构体)&#xff1a;是由一系列具有相同类型…

GoldenGate Logdump基本使用

Logdump是GoldenGate复制软件中附带的一个工具软件&#xff0c;在OGG的目录下可以找到。这个工具主要用于分析OGG生成的队列文件&#xff0c;查找记录、统计队列文件中的数据等。 在OGG安装目录下执行logdump.exe or ./logdump即可进入命令行。 开始查找记录之前&#xff0c;先…

js 里面的键盘事件对应的键码

js 里面的键盘事件经常用到&#xff0c;所以收集了键盘事件对应的键码来分享下&#xff1a; keyCode 8 BackSpace BackSpace keyCode 9 Tab Tab keyCode 12 Clear keyCode 13 Enter keyCode 16 Shift_L keyCode 17 Control_L keyCode 18 Alt_L keyCode 19 Pause keyCo…

.bam.bai的意义_业务活动监视器(BAM)2.0带来的革命

.bam.bai的意义生产兼具精益和企业价值的中间件是一项艰巨的工作。 它要么不存在&#xff0c;要么需要创新的思维&#xff08;很多&#xff09;&#xff0c;并且需要在实现中反复进行。 业务风险很大&#xff0c;但是如果您做对了&#xff0c;它就会使您领先于其他任何公司。 这…

数据结构和算法之排序五:选择排序

我们上一篇谈到了冒泡排序&#xff0c;其实我也说了&#xff0c;这两个排序方式何其相似&#xff0c;如果掌握了冒泡排序再来进行选择排序的理解我觉得完全没有太大的问题。那么什么叫做选择排序呢&#xff1f;我们可以理解为矮子里面挑高个&#xff0c;比如说呀有一个富翁来到…

Visual Studio Code使用问题

1、打开vscode黑屏 右击vscode快捷方式–>属性–>兼容性—>兼容模式打钩 重启vscode就可以了。 2、vscode终端没有显示路径&#xff0c;不能输入 显示如下图 则关闭VS Code ,右键单击VS Code 图标&#xff0c;选择属性->兼容性&#xff0c;取消勾选 已兼容模式运…

Java社区调查结果:74%的开发人员希望减少详细程度

一个新的JDK增强建议&#xff08;JEP&#xff09;在Java社区中风起云涌&#xff1a;JEP286。该建议建议在Java的未来版本中引入局部变量类型推断&#xff0c;以简化Java应用程序的编写。 在下面的文章中&#xff0c;我们将解释它的含义以及它将如何影响您的代码。 新帖&#…

【BZOJ2300】[HAOI2011]防线修建 set维护凸包

【BZOJ2300】[HAOI2011]防线修建 Description 近来A国和B国的矛盾激化&#xff0c;为了预防不测&#xff0c;A国准备修建一条长长的防线&#xff0c;当然修建防线的话&#xff0c;肯定要把需要保护的城市修在防线内部了。可是A国上层现在还犹豫不决&#xff0c;到底该把哪些城市…

Sass笔记(CSS 的预编译语言)

在线转换&#xff1a;https://www.sass.hk/css2sass/ Sass 是一种 CSS 的预编译语言。它提供了 变量&#xff08;variables&#xff09;、嵌套&#xff08;nested rules&#xff09;、 混合&#xff08;mixins&#xff09;、 函数&#xff08;functions&#xff09;等功能。 S…

mysql 主从同步-读写分离

主从同步与读写分离测试 一、 实验环境(主从同步) Master centos 7.3 192.168.138.13 Slave centos 7.3 192.168.138.14 二、在master操作 安装并配置文件[rootlocalhost ~]# yum install mariadb-server …

coherence安装_Oracle Coherence:分布式数据管理

coherence安装本文介绍如何使用Oracle Coherence提供分布式&#xff08;分区&#xff09;数据管理。 在下面的示例应用程序中&#xff0c;创建了一个名为OTV的新集群&#xff0c;并且在该集群的两个成员之间分配了一个名为user-map的缓存对象。 二手技术&#xff1a; JDK 1.6.…

AtomicReference 原子引用

原创 2016年03月04日 13:35:2076381.简介 赋值操作不是线程安全的。若想不用锁来实现&#xff0c;可以用AtomicReference<V>这个类&#xff0c;实现对象引用的原子更新。 使用场景&#xff1a;一个线程使用student对象&#xff0c;另一个线程负责定时读表&#xff0c;更新…

MongoDB基础使用

5.MongoDB基础使用 5.1.常用的命令&#xff08;重点&#xff09; > Help 查看帮助 显示数据库列表 > show dbs 创建数据库 > use dbname 如果数据库不存在&#xff0c;则创建数据库dbname&#xff0c;否则切换到指定数据库dbname。创建的数据库并不在数据库的列表中…

使用一些可选的将字符串配置属性转换为其他类型

有一天&#xff0c;您遇到一些代码&#xff0c;并认为这很漂亮&#xff0c;为什么我没有想到呢&#xff1f; 因此&#xff0c;我的长期同事Mark Warner在使用方法引用处理从String进行转换的标准名称/值存储模式方面有一个不错的选择。 int size store.getProperty("cac…

AttributeError: module 're' has no attribute 'sub'

文件不能同名&#xff08;import re re.py)转载于:https://www.cnblogs.com/realmonkeykingsun/p/7992613.html