`

easymock教程-record-replay-verify模型

阅读更多

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

 

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

 

public class UserServiceImplTest {

/**
     * this is a classic test case to use EasyMock.
     
*/

    @Test
    
public void testQuery() {
        User expectedUser 
= new User();
        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 
= new UserServiceImpl();
        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 = new User();
        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 = new UserServiceImpl();
        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框架广泛使用。

分享到:
评论

相关推荐

    easymock详解教程

    #### 1.4 easymock教程-record-replay-verify模型 easymock采用了record-replay-verify模型来简化mock对象的使用: 1. **Record阶段**:定义待模拟对象的行为预期。这包括指定方法调用的次数、顺序及返回值等。 2....

    easymock教程.pdf

    * Record-Replay-Verify模型:是easymock的核心模型,分别表示记录、重放和验证三个阶段。 ### easymock的使用 * 创建Mock对象:使用easymock的createMock方法创建Mock对象。 * 定义Mock行为:使用when方法定义...

    easymock-3.1

    5. **Record & Replay 模式**:EasyMock 3.1使用Record & Replay模式来设置和验证模拟行为。在Record阶段,你设定期望;在Replay阶段,执行测试并验证模拟对象的行为。 6. **Mock Object 的生命周期管理**:...

    easymock教程

    ##### 1.3 Record-Replay-Verify 模型 - **Record阶段**:在这个阶段,我们需要定义Mock对象的行为,即告诉Mock对象如何响应方法调用。 - **Replay阶段**:这是执行实际测试代码的阶段,在此期间,Mock对象会按照...

    easymock教程[归纳].pdf

    - Easymock的这个模型分为三个阶段:Record阶段设置预期行为,Replay阶段执行测试,Verify阶段验证模拟对象的行为是否符合预期。 4. **Easymock的典型使用** - 创建mock对象,指定期望的方法调用和返回值,然后在...

    easymock资料和源代码实例

    - **Record/Replay/Verify模式**:与旧版Easymock的工作流程相似,现在的新版本推荐使用`expect()`和`verify()`,而不是分开的record和replay阶段。 在压缩包中的"easymock"文件中,可能包含了Easymock的使用教程、...

    EasyMock单元测试例子

    3. **重放模式(Replay State)**:调用`EasyMock.replay(mockObject)`进入重放模式,此时模拟对象会根据之前的录制执行。 4. **验证模式(Verify State)**:测试结束后,调用`EasyMock.verify(mockObject)`检查...

    EasyMock 简介

    1. 记录(Record): EasyMock 记录 Mock 对象的行为,以便在后续的测试中使用。 2. 回放(Replay):EasyMock 根据录制的行为,模拟 Mock 对象的行为。 3. 验证(Verify):EasyMock 验证 Mock 对象的行为是否符合...

    java easymock

    3. **Record-Replay-Verify模型**: EasyMock的工作流程通常分为三个阶段:Record阶段,你定义模拟对象应该做什么;Replay阶段,执行测试,模拟对象按照记录的行为运行;Verify阶段,检查模拟对象的行为是否符合...

    JMockit基础教程

    例如,它使用注解而不是单独的方法来创建模拟对象,并且自动处理Record- Replay- Verify的切换,使测试代码更加清晰。 总之,JMockit是一个强大而灵活的工具,能够应对各种复杂的单元测试需求。无论是模拟静态方法...

    JMockit学习分享

    - **Record-Playback-Verify模型**:先记录预期的行为,然后回放这些行为并验证结果。 - **Record**:定义方法的调用和预期的返回值。 - **Replay**:在测试中调用记录的方法。 - **Verify**:验证方法调用的...

    Java单元测试入门

    Java中常用的Mock工具包括EasyMock、JMock、PowerMock和Mockit。这些工具的原理大致相同,主要是通过模拟对象来替代真实环境中的依赖项,以此来测试特定的方法或类。 五、Mockito的使用和常用方法 Mockito是Java...

Global site tag (gtag.js) - Google Analytics