EasyMock教程
Mocking是什么?
Mocking是一种在隔离测试一个类的功能。例如,无需数据库连接或属性文件中读取或文件服务器上读取需要测试的功能。 mock对象做实服务的嘲讽。一个mock对象返回对应于传递给它一些虚拟输入无效数据。
EasyMock
EasyMock便于无缝地创建模拟对象。它使用Java反射,以创造为给定接口的模拟对象。模拟对象是什么,只不过是代理的实际实现。考虑如:股票服务的情况下,它返回一个股票价格的详细信息。在开发过程中,实际的库存服务不能被用于获得实时数据。因此,我们需要一个虚拟的股票实施服务。简易模拟可以很容易理解顾名思义这样。
EasyMock的好处
不用手写 - 没有必要通过自己编写的模拟对象。
重构安全 - 重构接口方法的名称或重新排序的参数不会破坏测试代码在运行时创建。
返回值支持 - 支持返回值。
异常支持 - 支持例外/异常。
命令检查支持 - 支持检查命令方法调用。
注释支持 - 支持使用注解创建。
考虑下面的代码片段。
package com.yiibai.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);
}
}
让我们来了解上述程序的重要概念。完整的代码在第一个应用。
Portfolio - 进行股票名单,并获得用股票价格和股票数量计算的市场价值的对象。
Stock - 携带一只股票的详细信息,如它的id,名称,数量等的对象
StockService - 股票的服务接口,其功能是返回一个股票的当前价格。
EasyMock.createMock(...) - EasyMock股票创建了服务的模拟
EasyMock.expect(...).andReturn(...) - 模拟实现StockService接口用getPrice方法。对于googleStock,回到50.00的价格。
EasyMock.replay(...) - EasyMock准备模拟对象,以便它可以被用于测试目的。
portfolio.setStocks(...) - 现在的投资组合包含了两只股票列表。
portfolio.setStockService(...) - 分配的StockService模拟对象来组合。
portfolio.getMarketValue() - 基于使用的模拟股票服务公司的股票投资组合回报的市场价值。