Easymock 简明教程
EasyMock - Overview
What is Mocking?
模拟是一种隔离地测试类功能的方法。模拟不需要数据库连接或属性文件读取或文件服务器读取即可测试功能。模拟对象会对真实服务进行模拟。模拟对象会返回一个哑数据,它对应于传递给它的某个哑输入。
EasyMock
EasyMock 协助无缝创建模拟对象。它使用 Java 反射为给定的界面创建模拟对象。模拟对象不过是实际实现的代理。考虑 Stock Service 的情况,它返回某一股票的价格详情。在开发期间,实际股票服务不能用于获取实时数据。因此,我们需要股票服务的哑实现。正如其名称所示,EasyMock 可以很容易做到这一点。
Benefits of EasyMock
-
No Handwriting - 无需自己编写模拟对象。
-
Refactoring Safe - 重新命名界面方法名称或重新排列参数不会破坏测试代码,因为模拟是在运行时创建的。
-
Return value support - 支持返回值。
-
Exception support - 支持异常。
-
Order check support - 支持检查方法调用顺序。
-
Annotation support - 支持使用注解创建模拟。
Example
考虑以下代码片段。
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){
//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);
}
}
让我们理解一下上述程序中的重要概念。完整代码可通过第 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(…​) − 为投资组合分配股票服务 Mock 对象。
-
portfolio.getMarketValue() − 投资组合基于其股票使用模拟的股票服务返回市值。