EasyMock - 概述
什么是 Mocking?
Mocking 是一种单独测试类功能的方法。模拟不需要数据库连接或属性文件读取或文件服务器读取来测试功能。Mocking 模拟对象模拟实际服务。Mocking 模拟对象返回与传递给它的某些虚拟输入相对应的虚拟数据。
EasyMock
EasyMock 有助于无缝创建Mocking 模拟对象。它使用 Java 反射来为给定接口创建Mocking 模拟对象。Mocking 模拟对象只是实际实现的代理。考虑一个股票服务案例,它返回股票的价格详情。在开发过程中,实际的股票服务不能用于获取实时数据。所以我们需要股票服务的虚拟实现。 EasyMock 可以非常轻松地完成相同的操作,正如其名称所示。
EasyMock 的优势
无需手写 − 无需自行编写Mocking 模拟对象。
重构安全 − 重命名接口方法名称或重新排序参数不会破坏测试代码,因为模拟是在运行时创建的。
返回值支持 − 支持返回值。
异常支持 − 支持异常。
顺序检查支持 − 支持检查方法调用的顺序。
注释支持 − 支持使用注释创建模拟。
示例
请考虑以下代码片段。
package com.tutorialspoint.mock;
import java.util.ArrayList;
import java.util.List;
import org.EasyMock.EasyMock;
public class PortfolioTester {
public static void main(String[] args){
//创建要测试的投资组合对象
Portfolio portfolio = new 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);
//创建股票服务的Mocking 模拟对象
StockService stockServiceMock = EasyMock.createMock(StockService.class);
// 模拟股票服务的行为以返回各种股票的价值
EasyMock.expect(stockServiceMock.getPrice(googleStock)).andReturn(50.00);
EasyMock.expect(stockServiceMock.getPrice(microsoftStock)).andReturn(1000.00);
EasyMock.replay(stockServiceMock);
//将股票添加到投资组合
portfolio.setStocks(stocks);
//将 stockService 设置为投资组合
portfolio.setStockService(stockServiceMock);
double marketValue = portfolio.getMarketValue();
//验证市场价值为
//10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
System.out.println("投资组合的市场价值:"+ marketValue);
}
}
让我们了解上述程序的重要概念。完整代码可在第一个应用程序章中找到。
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() − 投资组合使用模拟股票服务返回基于其股票的市场价值。

