easymock教程_EasyMock教程–入门

本文介绍了如何使用EasyMock库在Java中进行单元测试,通过模拟StockMarket接口避免在测试中依赖真实服务器获取股票价格。文章提供了一个简单的Portfolio应用示例,展示如何创建和配置模拟对象,以及如何在JUnit测试中使用这些模拟对象来验证业务逻辑。
摘要由CSDN通过智能技术生成

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;
 
  @Before
  public void setUp() {
   portfolio = new Portfolio();
   portfolio.setName('Veera's portfolio.');
   marketMock = EasyMock.createMock(StockMarket.class);
   portfolio.setStockMarket(marketMock);
  }
 
  @Test
  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对象。 然后,我们要求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教程

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值