java recoed replay_easymock教程-record-replay-verify模型

record-replay-verify 模型容许记录mock对象上的操作然后重演并验证这些操作。这是目前mock框架领域最常见的模型,几乎所有的mock框架都是用这个模型,有些是现实使用如easymock,有些是隐式使用如jmockit。

以easymock为例,典型的easymock使用案例一般如下, 援引上一章中的例子:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassUserServiceImplTest{

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/**d18c02628675d0a2c816449d98bda930.png     * this is a classic test case to use EasyMock.

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.png    @Test

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidtestQuery(){

d18c02628675d0a2c816449d98bda930.png        User expectedUser=newUser();

d18c02628675d0a2c816449d98bda930.png        expectedUser.setId("1001");

d18c02628675d0a2c816449d98bda930.png        expectedUser.setAge(30);

d18c02628675d0a2c816449d98bda930.png        expectedUser.setName("user-1001");

d18c02628675d0a2c816449d98bda930.png        UserDao userDao=EasyMock.createMock(UserDao.class);

d18c02628675d0a2c816449d98bda930.png        EasyMock.expect(userDao.getById("1001")).andReturn(expectedUser);

d18c02628675d0a2c816449d98bda930.png        EasyMock.replay(userDao);

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png        UserServiceImpl  service=newUserServiceImpl();

d18c02628675d0a2c816449d98bda930.png        service.setUserDao(userDao);

d18c02628675d0a2c816449d98bda930.png        User user=service.query("1001");

d18c02628675d0a2c816449d98bda930.png        assertNotNull(user);

d18c02628675d0a2c816449d98bda930.png        assertEquals("1001", user.getId()); 

d18c02628675d0a2c816449d98bda930.png        assertEquals(30, user.getAge()); 

d18c02628675d0a2c816449d98bda930.png        assertEquals("user-1001", user.getName()); 

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png        EasyMock.verify(userDao);

ecedf933ec37d714bd4c2545da43add2.png    }8f1ba5b45633e9678d1db480c16cae3f.png}

在这里有两句非常明显的调用语句: Easymock.replay(...)和Easymock.verify(...)。这两个语句将上述代码分成三个部分,分别对应record-replay-verify 3个阶段

1. record

4f1150b881333f12a311ae9ef34da474.pngUser expectedUser=newUser();

4f1150b881333f12a311ae9ef34da474.png        expectedUser.setId("1001");

4f1150b881333f12a311ae9ef34da474.png        expectedUser.setAge(30);

4f1150b881333f12a311ae9ef34da474.png        expectedUser.setName("user-1001");

4f1150b881333f12a311ae9ef34da474.png        UserDao userDao=EasyMock.createMock(UserDao.class);

4f1150b881333f12a311ae9ef34da474.png        EasyMock.expect(userDao.getById("1001")).andReturn(expectedUser);

这里我们开始创建mock对象,并期望这个mock对象的方法被调用,同时给出我们希望这个方法返回的结果。

这就是所谓的"记录mock对象上的操作", 同时我们也会看到"expect"这个关键字。

总结说,在record阶段,我们需要给出的是我们对mock对象的一系列期望:若干个mock对象被调用,依从我们给定的参数,顺序,次数等,并返回预设好的结果(返回值或者异常).

2. replay

4f1150b881333f12a311ae9ef34da474.pngUserServiceImpl  service=newUserServiceImpl();

4f1150b881333f12a311ae9ef34da474.png        service.setUserDao(userDao);

4f1150b881333f12a311ae9ef34da474.png        User user=service.query("1001");

在replay阶段,我们关注的主要测试对象将被创建,之前在record阶段创建的相关依赖被关联到主要测试对象,然后执行被测试的方法,以模拟真实运行环境下主要测试对象的行为。

在测试方法执行过程中,主要测试对象的内部代码被执行,同时和相关的依赖进行交互:以一定的参数调用依赖的方法,获取并处理返回。我们期待这个过程如我们在record阶段设想的交互场景一致,即我们期望在replay阶段所有在record阶段记录的行为都将被完整而准确的重新演绎一遍,从而到达验证主要测试对象行为的目的。

3. verify

4f1150b881333f12a311ae9ef34da474.pngassertNotNull(user);

4f1150b881333f12a311ae9ef34da474.png        assertEquals("1001", user.getId()); 

4f1150b881333f12a311ae9ef34da474.png        assertEquals(30, user.getAge()); 

4f1150b881333f12a311ae9ef34da474.png        assertEquals("user-1001", user.getName()); 

4f1150b881333f12a311ae9ef34da474.png        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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值