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模型相关推荐

  1. Java 并发/多线程教程(四)-并发模型

    本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 并发系统可以有多 ...

  2. java官网教程(基础篇)—— 基础的Java类 —— 基础 I / O

    目录 基本 Java 类 基础 I/O I/O流 字节流 字符流 缓冲流 扫描和格式化 扫描 格式化 从命令行中进行IO操作 数据流 对象流 文件 I/O(采用 NIO.2) 什么是路径? Path类 ...

  3. Java 并发/多线程教程(五)-相同线程

    本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 相同线程是一并发框架模型,是一个单线程系统向外扩展成多个单线程的系统.这样的结果就是 ...

  4. Java Date Time 教程

    原文链接 作者:Jakob Jenkov  译者:魏嘉鹏 目录 Java 8 Date Time API Java 7 Date Time API 当你初次尝试弄明白怎么去使用Java的date ti ...

  5. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  6. Java设计模式 - 示例教程

    Java设计模式 - 示例教程 设计模式在软件开发人员中非常流行.设计模式是针对常见软件问题的良好描述的解决方案.我已经写了很多关于java设计模式的文章.您可以订阅我们的时事通讯下载PDF电子书(1 ...

  7. Odoo10教程---模块化三:模型约束,高级视图,工作流,安全性,向导,国际化和报表等

    模型约束 Odoo提供了两种设置自动验证不变量的方法: Python constraints 和SQL constraints. Python约束定义为用constrains()修饰的方法,并在记录集 ...

  8. Odoo10教程---模块化二:模型间关系,继承,计算字段等

    模型之间的关系 来自模型的记录可能与来自另一模型的记录相关.例如,一个销售订单记录和一个包含客户数据的客户记录相关:同时也和销售订单线记录相关. 练习 创建会话模型 对于模块Open Academy, ...

  9. Windows下Libvirt Java API使用教程(二)- 接口使用说明

    介绍完libvirt Java API的部署工作: <Windows下Libvirt Java API使用教程(一)- 开发环境部署> 接下来我们就介绍一下接口的使用和代码样例. libv ...

最新文章

  1. 选择HttpHandler还是HttpModule?
  2. python 打包 .app 运行 控制台窗口_Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法...
  3. koreader下载_koreader下载_koreader安装_koreader最新版_koreader安卓版下载_koreader app_易玩网...
  4. SLAM——绘制高精度地图的研究笔记
  5. 字节大牛耗时八个月又一力作,原理+实战讲解
  6. Activity intent经常使用的 FLAG 集合
  7. 2022年计算机二级Java语言程序设计练习题及答案
  8. html网页简单实现图片轮播效果,html+css+js简单实现图片轮播效果
  9. vue给标签动态添加元素_vue中用v-html加载html元素及三种方法给v-html元素添加样式(详解)...
  10. 【Hexo搭建个人博客】:yilia主题配置(三) - 评论系统
  11. 高通平台wifi命令操作
  12. DOCTYPE 的作用是什么
  13. 计算机软件基础自考实践报告,信息作战自考实践报告
  14. 【深圳】大疆创新 - 测试/测试开发工程师 - 自动驾驶方向
  15. 3D人脸建模系统市场现状研究分析-
  16. c盘java文件误删_清理C盘误删的文件怎么恢复
  17. (C语言)汉诺塔与受限汉诺塔
  18. python水位传感器输出水位_水位传感器原理 怎么判断水位传感器是否坏了
  19. 小米VR nolo 安装调试简介
  20. android版本更新功能

热门文章

  1. 为什么我加了过滤器然后就登不进去了_布隆过滤器过时了,未来属于布谷鸟过滤器?...
  2. jquery mobile pc上可以滚动 手机上不能上下滚动_胶天下 | 胶粘剂在手机镜片粘接中的应用...
  3. echarts-formatter
  4. Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed betwee...
  5. Mybatis 查询返回List<String>集合
  6. python calendar.isleap_Python calendar isleap()用法及代碼示例
  7. 福特牵手百度启动L4级自动驾驶联合测试,年底“上路”
  8. nginx配置及操作简要记录
  9. Downloading SRA data using command line utilities
  10. 企业架构 - 涉众管理(Stakeholder Management)