参考案例:(本位使用markdown编写)https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/https://www.yiibai.com/easymock/git.oschina实例:https://gitee.com/lhhTestTool/LhhEasyMock# LhhEasyMock# EasyMock EasyMock便于无缝地建立模拟对象。它使用Java反射,以创造为给定接口的模拟对象。模拟对象是什么,只不过是代理的实际实现。考虑如:股票服务的状况下,它返回一个股票价格的详细信息。在开发过程当中,实际的库存服务不能被用于得到实时数据。所以,咱们须要一个虚拟的股票实施服务。简易模拟能够很容易理解顾名思义这样# EasyMock的好处* 不用手写 - 没有必要经过本身编写的模拟对象。* 重构安全 - 重构接口方法的名称或从新排序的参数不会破坏测试代码在运行时建立。* 返回值支持 - 支持返回值。* 异常支持 - 支持例外/异常。* 命令检查支持 - 支持检查命令方法调用。* 注释支持 - 支持使用注解建立。# EasyMock架包 <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>RELEASE</version> </dependency># 阶段介绍## 数据准备阶段``` //建立一个要测试的组合对象 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);```## Record 阶段``` // Mock的Record 阶段 -》 在这个阶段,Record 状态,用户能够设定 Mock 对象的预期行为和输出,这些对象行为被录制下来,保存在 Mock 对象中 //建立提供数据(股票)服务的模拟对象 StockService stockService = EasyMock.createMock(StockService.class); //模拟数据(股票)服务的行为,以返回各类方法的价值。设定return的返回值 EasyMock.expect(stockService.getPrice(googleStock)).andReturn(50.00); EasyMock.expect(stockService.getPrice(microsoftStock)).andReturn(1000.00);```## Replay 阶段 `replay()`,将 Mock 对象的状态置为 `Replay 状态`。``` //Mock的Replay 阶段 -》 在这个阶段,在使用 Mock 对象进行实际的测试前,咱们须要将 Mock 对象的状态切换为 Replay。在 Replay 状态,Mock 对象可以根据设定对特定的方法调用做出预期的响应。 EasyMock.replay(stockService); //在业务处理组合中增长数据项 portfolio.setStocks(stocks); //在业务处理组合中增长数据服务 portfolio.setStockService(stockService);```## 测试调用阶段``` //实际处理逻辑 double marketValue = portfolio.getMarketValue(); //验证数据处理 10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500 System.out.println("Market value of the portfolio: "+ marketValue);```## EasyMock 验证阶段(非必须)``` //Mock的验证阶段 (验证调用过程正常完成) EasyMock.verify(stockService);```# EasyMock 方法汇总## EasyMock 构建和初始化 1.EasyMock静态方法createMock > 使用 EasyMock 动态构建 Mock 对象2.EasyMock静态方法createControl> 能建立一个接口 IMocksControl 的对象,该对象能建立并管理多个 Mock 对象。若是须要在测试中使用多个 Mock 对象,咱们推荐您使用这一机制,由于它在多个 Mock 对象的管理上提供了相对便捷的方法。> 若是您要模拟的是一个具体类而非接口,那么您须要下载扩展包 `EasyMock Class Extension 2.2.2`。在对具体类进行模拟时,您只要用 `org.easymock.classextension.EasyMock` 类中的静态方法代替 `org.easymock.EasyMock` 类中的静态方法便可。3,replay(mockResultSet) or replay();> 将 Mock 对象切换到 Replay 状态两种使用方式: eg 1.若是构建对象`IMocksControl`则调用它的`.replay()`; 2.若是构建对象为具体的咱们业务测试对象,则调用`EasyMock.replay(xxx);`(本例调用这个)4.verify(mockResultSet) or verify();> 对 Mock 对象的行为进行验证两种使用方式: eg 1.若是构建对象`IMocksControl`则调用它的`.verify()`; 2.若是构建对象为具体的咱们业务测试对象,则调用`EasyMock.verify(xxx);`(本例调用这个)5.reset > 为了不生成过多的 Mock 对象,EasyMock 容许对原有 Mock 对象进行重用。要对 Mock 对象从新初始化,咱们能够采用 reset 方法两种使用方式: eg 1.若是构建对象`IMocksControl`则调用它的`.reset ()`; 2.若是构建对象为具体的咱们业务测试对象,则调用`EasyMock.reset (xxx);`(本例调用这个)# IExpectationSetters 对 Mock 对象行为的添加和设置是经过接口 IExpectationSetters 来实现的 两种类型的输出:(1)产生返回值;(2)抛出异常。 1.IExpectationSetters<T> andReturn(T value);> 设定返回值2.void andStubReturn(T value);> 有时,某个方法的调用老是返回一个相同的值,为了不每次调用都为 Mock 对象的行为进行一次设定3.IExpectationSetters<T> andThrow(Throwable throwable);> 设定预期抛出异常4.void andStubThrow(Throwable throwable);> 设定抛出默认异常的函数 与 `andStubReturn` 相似5.IExpectationSetters<T> times(int count);> 该方法能够 Mock 对象方法的调用次数进行确切的设定 eg: `andReturn("My return value").times(3);`6. times(int minTimes, int maxTimes)> 该方法最少被调用 minTimes 次,最多被调用 maxTimes 次7.atLeastOnce()> 该方法至少被调用一次。8. anyTimes()> 该方法能够被调用任意次。eg: `expect(mockResult.close()).times(3, 5);`9.其余方式 参考文章 https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/ https://www.yiibai.com/easymock/