概述
什么是Mocking?
模拟是一种独立测试类功能的方法。 模拟不需要数据库连接或属性文件读取或文件服务器读取来测试功能。 模拟对象可以模拟真实服务。 模拟对象返回与传递给它的一些虚拟输入相对应的虚拟数据。
EasyMock
EasyMock有助于无缝地创建模拟对象。 它使用Java Reflection来为给定的接口创建模拟对象。 模拟对象只是实际实现的代理。 考虑一个股票服务案例,它返回股票的价格细节。 在开发过程中,实际的库存服务不能用于获取实时数据。 所以我们需要一个虚拟的股票服务实现。 EasyMock可以很容易地做到这一点,顾名思义。
EasyMock的好处
No Handwriting - 无需自己编写模拟对象。
Refactoring Safe - 重命名接口方法名称或重新排序参数不会破坏测试代码,因为Mocks是在运行时创建的。
Return value support - 支持返回值。
Exception support - 支持异常。
Order check support - 支持检查方法调用的顺序。
Annotation support - 支持使用注释创建模拟。
请考虑以下代码段。
package cn.xnip.mock;
import java.util.ArrayList;
import java.util.List;
import org.EasyMock.EasyMock;
public class PortfolioTester {
public static void main(String[] args){
//Create a portfolio object which is to be tested
Portfolio portfolio = new Portfolio();
//Creates a list of stocks to be added to the portfolio
List<stock> stocks = new ArrayList<stock>();
Stock googleStock = new Stock("1","Google", 10);
Stock microsoftStock = new Stock("2","Microsoft",100);
stocks.add(googleStock);
stocks.add(microsoftStock);
//Create the mock object of stock service
StockService stockServiceMock = EasyMock.createMock(StockService.class);
// mock the behavior of stock service to return the value of various stocks
EasyMock.expect(stockServiceMock.getPrice(googleStock)).andReturn(50.00);
EasyMock.expect(stockServiceMock.getPrice(microsoftStock)).andReturn(1000.00);
EasyMock.replay(stockServiceMock);
//add stocks to the portfolio
portfolio.setStocks(stocks);
//set the stockService to the portfolio
portfolio.setStockService(stockServiceMock);
double marketValue = portfolio.getMarketValue();
//verify the market value to be
//10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
System.out.println("Market value of the portfolio: "+ marketValue);
}
}
</stock></stock>
让我们理解上述计划的重要概念。 完整的代码可在第First Application一章中找到。
Portfolio - 一个承载股票清单并使用股票价格和股票数量计算市场价值的对象。
Stock - 一个承载股票详细信息的对象,例如其ID,名称,数量等。
StockService - 股票服务返回股票的当前价格。
EasyMock.createMock(...) - EasyMock创建了一个模拟股票服务。
EasyMock.expect(...).andReturn(...) - 模拟执行stockService接口的getPrice方法。 对于googleStock,返回50.00作为价格。
EasyMock.replay(...) - EasyMock准备Mock对象准备就绪,以便它可以用于测试。
portfolio.setStocks(...) - 投资组合现在包含两个股票的清单。
portfolio.setStockService(...) - 将stockService Mock对象分配给投资组合。
portfolio.getMarketValue() - 投资组合使用模拟股票服务基于其股票返回市场价值。