EasyMock教程-入门指南

标签: IT技术 EasyMock | 发表时间:2012-07-29 19:43 | 作者:童海波
出处:http://blog.jobbole.com

在过去,我会经常向你展示 EasyMock 是什么和怎样使用它测试你的Java应用。基于这个目的,我将创建一个简单的股票程序并使用 JUnit 和 EasyMock 库测试。

在开始之前,让我们先理解一下使用 EasyMock 的需求。加入,你在创建一个Android 移动应用用来获取用户股票档案。你的应用需要使用股票市场服务从正式服务器来检索股票价格(例如纳斯达克)。

当你开始测试代码的时候,你也许不会想要去使用真实股票市场服务器来获取股票价格。相反,你也许希望来些虚拟价格数据。所以你需要模拟股票市场服务然后返回虚拟数据,而不去访问真实服务器。

EasyMock 就是用来干这事的 — 帮你模拟接口。你可以预定义一些模拟对象的行为,然后在测试代码时使用模拟这些对象。因为你关心的是测试你的代码逻辑而不是外在服务和对象。因此。

EasyMock教程-入门指南

为了使之清晰,请看一下下面的代码摘要:

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

第一行,我们要求 EasyMock 创建一个服务于  StockMarket 接口的模拟对象。然后第二行,我们定义了这个虚拟对象的行为–例如当getPrice()对象被调用并传递 “ EBAY” 参数时,模拟对象将返回 42.00 .然后我们调用  replay() 方法时,将使模拟对象备用。

这样就差不错关联好了 EasyMock 的上下文了和它的基本使用。接下来将深入我们的证劵应用。

注意:点击此处下载 GitHub 上的源码

证卷应用

我们的证券应用非常简单。有一个  Stock 类来存储股票名和数量, Portfolio 类来保存股票列表。 Portfolio 类有一个方法用来计算证券的总价格。我们的类用  StockMarket 对象来检索股票价格。当测试我们的代码时,我们将使用 EasyMock 来模拟StockMarket。

Stock.java

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 应用

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;

	@Before
	public void setUp() {
		portfolio = new Portfolio();
		portfolio.setName("Veera's portfolio.");
		marketMock = EasyMock.createMock(StockMarket.class);
		portfolio.setStockMarket(marketMock);
	}

	<a href="http://my.oschina.net/test45" target="_blank" rel="nofollow">@Test</a>
	public 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 对象。然后我们调用  EasyMock要求为  StockMarket 接口创建一个模拟对象。然后我们使用  Portfolio.setStockMarket() 方法将这个对象注入到  Portfolio 对象。

在  @Tes t方法,我们使用以下代码定义模拟对象的行为:

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

这样一来,当  getPrice() 方法带有  “EBAY” 的参数被调用的时候,将会返回42.00。

然后我们创建了一个数量为2的 ebayStock 股票,并将其添加到我们的 Portfolio 中。将我们设置 EBAY 价格为 42.00 时,我们便知道股票的总价格为 84.00(2*42.00)。在最后一行,我们使用 assertEquals() 进行了同样的声明。

如果  getTotalValue() 中代码不出错的话,以上测试应该会成功,否则测试将会失败。

结论

以上便是如果使用 EasyMock 库模拟外部服务/对象以及在测试代码中使用的示例,EasyMock 能做的远不止我在上面展示的,点击这里了解更多关于 EasyMock 的信息。

原文链接 

你可能感兴趣的文章

相关 [easymock] 推荐:

easymock教程-目录

- 赵星云 - BlogJava-首页技术区
easymock是目前java mock 工具中比较流行的工具,这个教程将系统的介绍easymock的使用. 主要内容来自easymock的官网教程,针对日常使用进行了一些筛选和补充,另外增加一些个人的理解和认识. 另外考虑到网络上已有不少分散的教程,我将适当的链接进来. 教程的内容将在随后逐渐添加,目前计划的目录如下,相应内容完成之后我将逐个更新此文的链接.

EasyMock教程-入门指南

- - 博客 - 伯乐在线
在过去,我会经常向你展示 EasyMock 是什么和怎样使用它测试你的Java应用. 基于这个目的,我将创建一个简单的股票程序并使用 JUnit 和 EasyMock 库测试. 在开始之前,让我们先理解一下使用 EasyMock 的需求. 加入,你在创建一个Android 移动应用用来获取用户股票档案.

利用h2database和easymock轻松不依赖环境单元测试(rose等spring环境万能)

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. 写java时间久了,慢慢就变得自信了,也可能是变得懒了,或者是项目进度的原因,test case越写越少,越来越不写了. 还有一个很大的原因是,DB环境不好搞,老是有垃圾数据,依赖的东西太多,有memcache、有别人的服务,等等等等,都是没有test case良好的理由.