java recoed replay_easymock教程-record-replay-verify模型
record-replay-verify 模型容许记录mock对象上的操作然后重演并验证这些操作。这是目前mock框架领域最常见的模型,几乎所有的mock框架都是用这个模型,有些是现实使用如easymock,有些是隐式使用如jmockit。
以easymock为例,典型的easymock使用案例一般如下, 援引上一章中的例子:
publicclassUserServiceImplTest{
/** * this is a classic test case to use EasyMock.
*/ @Test
publicvoidtestQuery(){
User expectedUser=newUser();
expectedUser.setId("1001");
expectedUser.setAge(30);
expectedUser.setName("user-1001");
UserDao userDao=EasyMock.createMock(UserDao.class);
EasyMock.expect(userDao.getById("1001")).andReturn(expectedUser);
EasyMock.replay(userDao);
UserServiceImpl service=newUserServiceImpl();
service.setUserDao(userDao);
User user=service.query("1001");
assertNotNull(user);
assertEquals("1001", user.getId());
assertEquals(30, user.getAge());
assertEquals("user-1001", user.getName());
EasyMock.verify(userDao);
}}
在这里有两句非常明显的调用语句: Easymock.replay(...)和Easymock.verify(...)。这两个语句将上述代码分成三个部分,分别对应record-replay-verify 3个阶段
1. record
User expectedUser=newUser();
expectedUser.setId("1001");
expectedUser.setAge(30);
expectedUser.setName("user-1001");
UserDao userDao=EasyMock.createMock(UserDao.class);
EasyMock.expect(userDao.getById("1001")).andReturn(expectedUser);
这里我们开始创建mock对象,并期望这个mock对象的方法被调用,同时给出我们希望这个方法返回的结果。
这就是所谓的"记录mock对象上的操作", 同时我们也会看到"expect"这个关键字。
总结说,在record阶段,我们需要给出的是我们对mock对象的一系列期望:若干个mock对象被调用,依从我们给定的参数,顺序,次数等,并返回预设好的结果(返回值或者异常).
2. replay
UserServiceImpl service=newUserServiceImpl();
service.setUserDao(userDao);
User user=service.query("1001");
在replay阶段,我们关注的主要测试对象将被创建,之前在record阶段创建的相关依赖被关联到主要测试对象,然后执行被测试的方法,以模拟真实运行环境下主要测试对象的行为。
在测试方法执行过程中,主要测试对象的内部代码被执行,同时和相关的依赖进行交互:以一定的参数调用依赖的方法,获取并处理返回。我们期待这个过程如我们在record阶段设想的交互场景一致,即我们期望在replay阶段所有在record阶段记录的行为都将被完整而准确的重新演绎一遍,从而到达验证主要测试对象行为的目的。
3. verify
assertNotNull(user);
assertEquals("1001", user.getId());
assertEquals(30, user.getAge());
assertEquals("user-1001", user.getName());
EasyMock.verify(userDao);
在verify阶段,我们将验证测试的结果和交互行为。
通常验证分为两部分,如上所示: 一部分是验证结果,即主要测试对象的测试方法返回的结果(对于异常测试场景则是抛出的异常)是否如预期,通常这个验证过程需要我们自行编码实现。另一部分是验证交互行为,典型如依赖是否被调用,调用的参数,顺序和次数,这部分的验证过程通常是由mock框架来自动完成,我们只需要简单调用即可。
在easymock的实现中,verify的部分交互行为验证工作,会提前在replay阶段进行:比如未记录的调用,调用的参数等。如果验证失败,则直接结束replay以致整个测试案例。
record-replay-verify 模型非常好的满足了大多数测试场景的需要:先指定测试的期望,然后执行测试,再验证期望是否被满足。这个模型简单直接,易于实现,也容易被开发人员理解和接受,因此被各个mock框架广泛使用。
posted on 2010-10-15 14:50 sky ao 阅读(3589) 评论(0) 编辑 收藏 所属分类: software test
java recoed replay_easymock教程-record-replay-verify模型相关推荐
- Java 并发/多线程教程(四)-并发模型
本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 并发系统可以有多 ...
- java官网教程(基础篇)—— 基础的Java类 —— 基础 I / O
目录 基本 Java 类 基础 I/O I/O流 字节流 字符流 缓冲流 扫描和格式化 扫描 格式化 从命令行中进行IO操作 数据流 对象流 文件 I/O(采用 NIO.2) 什么是路径? Path类 ...
- Java 并发/多线程教程(五)-相同线程
本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 相同线程是一并发框架模型,是一个单线程系统向外扩展成多个单线程的系统.这样的结果就是 ...
- Java Date Time 教程
原文链接 作者:Jakob Jenkov 译者:魏嘉鹏 目录 Java 8 Date Time API Java 7 Date Time API 当你初次尝试弄明白怎么去使用Java的date ti ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...
- Java设计模式 - 示例教程
Java设计模式 - 示例教程 设计模式在软件开发人员中非常流行.设计模式是针对常见软件问题的良好描述的解决方案.我已经写了很多关于java设计模式的文章.您可以订阅我们的时事通讯下载PDF电子书(1 ...
- Odoo10教程---模块化三:模型约束,高级视图,工作流,安全性,向导,国际化和报表等
模型约束 Odoo提供了两种设置自动验证不变量的方法: Python constraints 和SQL constraints. Python约束定义为用constrains()修饰的方法,并在记录集 ...
- Odoo10教程---模块化二:模型间关系,继承,计算字段等
模型之间的关系 来自模型的记录可能与来自另一模型的记录相关.例如,一个销售订单记录和一个包含客户数据的客户记录相关:同时也和销售订单线记录相关. 练习 创建会话模型 对于模块Open Academy, ...
- Windows下Libvirt Java API使用教程(二)- 接口使用说明
介绍完libvirt Java API的部署工作: <Windows下Libvirt Java API使用教程(一)- 开发环境部署> 接下来我们就介绍一下接口的使用和代码样例. libv ...
最新文章
- 选择HttpHandler还是HttpModule?
- python 打包 .app 运行 控制台窗口_Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法...
- koreader下载_koreader下载_koreader安装_koreader最新版_koreader安卓版下载_koreader app_易玩网...
- SLAM——绘制高精度地图的研究笔记
- 字节大牛耗时八个月又一力作,原理+实战讲解
- Activity intent经常使用的 FLAG 集合
- 2022年计算机二级Java语言程序设计练习题及答案
- html网页简单实现图片轮播效果,html+css+js简单实现图片轮播效果
- vue给标签动态添加元素_vue中用v-html加载html元素及三种方法给v-html元素添加样式(详解)...
- 【Hexo搭建个人博客】:yilia主题配置(三) - 评论系统
- 高通平台wifi命令操作
- DOCTYPE 的作用是什么
- 计算机软件基础自考实践报告,信息作战自考实践报告
- 【深圳】大疆创新 - 测试/测试开发工程师 - 自动驾驶方向
- 3D人脸建模系统市场现状研究分析-
- c盘java文件误删_清理C盘误删的文件怎么恢复
- (C语言)汉诺塔与受限汉诺塔
- python水位传感器输出水位_水位传感器原理 怎么判断水位传感器是否坏了
- 小米VR nolo 安装调试简介
- android版本更新功能
热门文章
- 为什么我加了过滤器然后就登不进去了_布隆过滤器过时了,未来属于布谷鸟过滤器?...
- jquery mobile pc上可以滚动 手机上不能上下滚动_胶天下 | 胶粘剂在手机镜片粘接中的应用...
- echarts-formatter
- Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed betwee...
- Mybatis 查询返回List<String>集合
- python calendar.isleap_Python calendar isleap()用法及代碼示例
- 福特牵手百度启动L4级自动驾驶联合测试,年底“上路”
- nginx配置及操作简要记录
- Downloading SRA data using command line utilities
- 企业架构 - 涉众管理(Stakeholder Management)