一、Mock定义
日常测试过程中,对一些不容易构造的对象,通过mock模拟对象的行为。例如A,B两个模块,A依赖B,B未开发完成,通过mockB对象,返回预期的结果给A调用。

二、Easymock

原理:Easymock通过动态代理实现模拟对象的创建

2.1 Maven中添加EasyMock依赖

<dependency><groupId>org.easymock</groupId><artifactId>easymock</artifactId><version>4.3</version><scope>test</scope>
</dependency>

2.2 将查询接口注释

/*** @author:jack* @date 2021/5/30 19:25* @des:todo*/
@Service
public class GoodsService {@AutowiredGoodDao goodDao;//新增商品(注释内部实现,测试mock调用)public void insert(Goods goods){//        return goodDao.insert(goods);}//查询所有商品(注释内部实现,测试mock调用)public List<Goods> queryGoodList(){//        return goodDao.queryGoodList();}//根据id查询商品信息(注释内部实现,测试mock调用)public Goods queryById(int id){//        return goodDao.queryById(id);}
}

2.3 通过mock创建查询接口

 @Testpublic void testQueryGoodById(){//创建期待的结果Goods goods1 = new Goods();goods1.setId(5);goods1.setGoodName("电脑");goods1.setGoodNum(99);goods1.setGoodDes("这是一台电脑");//1、创建Mock对象GoodsService mock = EasyMock.createMock(GoodsService.class);//2、模拟调用该mock对象抛出异常//EasyMock.expect(mock.queryById(5)).andThrow(new RuntimeException());//3、调用mock对象中的queryById接口进行模拟,EasyMock.anyInt())限制输入类型,根据数据类型,支持:anyInt(),anyShort(),anyByte(),angLong()...// EasyMock.expect(mock.queryById(EasyMock.anyInt())).andReturn(goods1);//4、测试该mock对象调用次数EasyMock.expect(mock.queryById(5)).andReturn(goods1).times(3);//5、重放Mock对象,将录制的对象代替真实的对象EasyMock.replay(mock);Goods good = mock.queryById(5);//预期值和实际值进行断言Assert.assertEquals(goods1,good);//验证mock对象被调用EasyMock.verify(mock);

注:
1、通过mock模拟GoodsService,mock调用queryById返回预期的结果,并进行断言。

2、EasyMock.createMock():必须用指定的参数调用指定的方法,不考虑调用方法的次序,调用未预期的方法会导致失败。
EasyMock.createStrictMock():必须按次序调用指定的方法,调用未逾期的方法会失败。

 GoodsService mock = EasyMock.createMock(GoodsService.class);

3、通过EasyMock.anyInt()对传入参数进行校验,类似泛型,还支持:EasyMock.anyShort()、EasyMock.anyByte()、EasyMock.anyLong()、EasyMock.anyFloat()、EasyMock.anyDouble()、EasyMock.anyBoolean(),输入类型不符的参数会报错。

EasyMock.expect(mock.queryById(EasyMock.anyInt())).andReturn(goods1);

4、 通过andReturns设置调用后返回的结果。

EasyMock.expect(mock.queryById(5)).andReturn(goods1);

5、测试方法调用的次数,与预期次数不符报错。

EasyMock.expect(mock.queryById(5)).andReturn(goods1).times(3);

6、模拟调用方法返回异常信息(常用)

EasyMock.expect(mock.queryById(5)).andThrow(new RuntimeException());
EasyMock.replay(mock);
Goods goods = mock.queryById(5);
Assert.assertNull(goods);
EasyMock.verify(mock);

2.4 mock无返回值对象
将GoodService中的insert()方法改为无返回值(应该为Boolean类型)
此时想mock插入对象的插入方法,需要进行修改:
正常mock:

mock.insert(goods);
EasyMock.expectLastCall().anyTimes();

异常mock:

EasyMock.expectLastCall().anyTimes();
EasyMock.expectLastCall().andThrow(new RuntimeException()).anyTimes();

2.5 mock多次调用返回不同的值
在测试用例的执行中,会有需求多次运行的过程中返回不同的值,这里简单举例:

EasyMock.expect(queryGoodList.next()).andReturn(true).times(5).andReturn(false).times(2);

三、总结
测试过程中,mock能大大的提高我们的效率,模拟各种想要的参数,得到想要的结果,但是会隐藏mock对象中较多的bug,导致测试不充分。在任何情况下,mock都不应该是我们的第一选择,在真实存在的场景下进行测试,才能发现更多的问题。
本文简单的介绍Easymock的使用,基本覆盖常用的mock场景,有兴趣深入的同学可阅读此篇文章:https://tech.youzan.com/mock/。

EasyMock测试相关推荐

  1. 单元测试 easymock_使用EasyMock更轻松地测试

    单元测试 easymock 测试驱动的开发是软件开发的重要组成部分. 如果未测试代码,则该代码已损坏. 所有代码都必须经过测试,理想情况下,应在模型代码之前编写测试. 但是有些事情比其他事情更容易测试 ...

  2. easymock教程_EasyMock教程–入门

    easymock教程 在本文中,我将向您展示EasyMock是什么,以及如何使用它来测试Java应用程序. 为此,我将创建一个简单的Portfolio应用程序,并使用JUnit&EasyMoc ...

  3. JUnit与EasyMock合作

    开发人员始终需要注意所产生的代码. 在实施新功能或修复某些错误之后,应确保它们能够正常工作. 至少可以借助单元测试来实现. 由于此博客致力于Java编程语言,因此今天我将撰写有关JUnit 4.1和E ...

  4. EasyMock教程–入门

    在本文中,我将向您展示EasyMock是什么,以及如何使用它来测试Java应用程序. 为此,我将创建一个简单的Portfolio应用程序,并使用JUnit&EasyMock库对其进行测试. 在 ...

  5. sm羞耻任务_羞耻驱动的发展

    sm羞耻任务 我一直渴望写出精巧的代码 . 在完成所有生产代码配对的日常工作中,我认为我们的质量很高. 但是令人惊讶的是,当您独自编码时,您多么容易原谅自己并陷入不良习惯. 配对时羞耻是品质背后的动力 ...

  6. Android应用测试方法总结

    Android应用测试方法总结   这是一份有关Android应用测试学习的总结文档,对Android应用测试进行了一个简单的梳理.相关测试方法的应用过程以及一些测试工具的设计实现等详见我的博客:ht ...

  7. 【读书笔记】《代码不朽》

    [<代码不朽>读书笔记] 第一章:简介 "简单"原则: 对每次提交负责. 第二章:函数要短 [要求]<=15行 [做法] 提取方法 替换为方法对象 第三章:逻辑分 ...

  8. 干货!用大白话告诉你什么是Mock测试

    初识mock 作为一个动词,mock是模拟.模仿的意思:作为一个名词,mock是能够模仿真实对象行为的模拟对象. 在软件测试中,mock所模拟的对象是什么呢? 它一定不是我们所测试的对象,而是 SUT ...

  9. easymock快速入门

    2019独角兽企业重金招聘Python工程师标准>>> easymock是众多mock之中的很容易用的mock,今天刚开始学习,来个简单的教程.以购物车结算为例子,比如首先是每一个商 ...

最新文章

  1. 51.1AP!单阶段检测器的新纪录,TOOD:即插即用的检测器换头术,显著提升性能
  2. 研究电子计算机的想法,电子计算机发明于哪一年 1946年在美国问世(为研制导弹而生)...
  3. 三维重建学习(2):相机标定基础
  4. 2519485c7dcfe0295a41d4e0f69bb10a 求解
  5. ACL 2020 开源论文 | 基于Span Prediction的共指消解模型
  6. python ctime函数_Python中的ctime()方法使用教程
  7. scp报错:not a regular file
  8. linux ssh和scp,Linux SSH 与 SCP命令简述
  9. .net 服务器端自定义分页控件 简单示例
  10. [JavaWeb-JavaScript]JavaScript与html结合方式
  11. 机器学习中用到的概率知识_山顶洞人学机器学习之——几种常见的概率分布
  12. 377.组合总和IV
  13. 提取unity3d游戏资源文件
  14. DSP程序结构优化技巧
  15. 序列傅里叶变换性质matlab,MATLAB傅里叶变换及性质.docx
  16. O2OA办公平台:考勤配置管理手册
  17. openssl cer文件转pem文件
  18. 百度竞价需抓住消费者心理
  19. 二清,是“担保支付”,还是“雁过拔毛”
  20. 深度解析C语言文件操作以及常见问题

热门文章

  1. C:\wamp64\bin\mysql\mysql5.7.23\bin 远程连接
  2. 支持通话/音量加减/接听功能TypeC线控耳机方案开发
  3. 【安全知识分享】承包商入厂安全培训课件(106页).pptx(附下载)
  4. Java8 中计算两个日期间隔多少年、多少月、多少天的实现
  5. GX Works3 跨网访问
  6. Ajax广告词,用 ajax 的方法解决网页广告显示的问题
  7. HDU 5066 Harry And Physical Teacher(物理题)
  8. 计算机相关理论和实践知识题,计算机上机考试模拟考试习题.doc
  9. 机器人抓取 机器人物体三维定位 三维匹配
  10. 马云管理日志有感语句1