`

请您先登录,才能继续操作

easymock教程-class mocking

阅读更多

    前面的例子中,mock的对象都是基于interface,虽然说我们总是强调要面对接口编程,而不要面对实现,但是实际开发中不提取interface而直接使用class的场景非常之多。尤其是一些当前只有一个明确实现而看不到未来扩展的类,是否应该提取interface或者说是否应该现在就提取interface,总是存在争论。

 

    这种情况下,我们就会面临主要测试对象依赖到一个具体类而不是interface的情况,easymock中通过class extension 来提供对class mocking的支持。

 

1. class mocking的使用

 

    easymock class extension的使用方式和普通的interface mock完全一致,基本上easymock中有的功能easymock class extension都同样提供,而且所有的类名和方法名都保持一致。

 

     ClassA impl = Easymock.createMock(ClassA.class);
            Easymock.expect(impl.getById("1001")).andReturn(...);
            Easymock.replay(impl);
   
    唯一的差异在于,easymock class extension的java package和easymock不同,easymock是org.easymock.*, 而 easymock class extension是org.easymock.classextension.*,典型如 org.easymock.classextension.Easymock 对应 org.easymock.Easymock。另外在发布时,两者是分开发布的,easymock.jar 和 easymockclassextension.jar,需要根据需要分别导入,或者必要时同时导入。

 

2. 3.0新版本和向后兼容

 

    我们来回顾一下easymock的历史版本: easymock 1.* 非常久远了,已经没有人在用。2.0版本在2005-12-24发布,基于jdk1.5,之后陆续发布的2.1/2.2/2.3/2.4/2.5等几个版本中,都提供了对应版本的easymock class extension。easymock 3.0 版本是最新版本,2010-05-08 发布,主要改进就是将easymock class extension的功能合并到easymock中,以后只要使用easymock就可以提供class mocking的功能。当然为了兼容2.*下的旧代码,依然提供了EasyMock 3.0 Class Extension代理到easymock 3.0。

 

    3.0版本之后,easymock class extension的class mocking功能已经无缝集成到easymock中,因此代码的编写简洁了很多,强烈建议新用户直接使用3.0版本。对于使用2.*版本的旧有代码,easymock提供了easymock class extension的3.0版本,兼容2.*的代码,底层实现实际是代理给easymock3.0。因此2.*版本easymock class extension的用户可以通过简单的升级easymock class extension到3.0即可平滑升级,之后再逐渐替换掉easymock class extension的代码。

 

3. class mocking的限制

 

    class mocking是有一些限制的,

    1) 不能mock类的 final方法

 如果final方法被调用,则只能执行原有的正常代码。

 

    2) 不能mock类的static 方法。

        同样如果private方法被调用,只能执行原有的正常代码。


    3) 不能mock类的一些特殊方法: equals(), toString()和hashCode().

 原因是easymock在实现是为每个class mock对象提供了内建的以上三个方法。需要强调的是,对于基于interface的mock,这个限制也是同样存在的,即使以上三个方式是interface定义的一部分。


    在使用时需要避开这种场景,或者组合使用其他的mock 框架比如jmockit来mock private方法和final方法。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    easymock详解教程

    Partial class mocking是指模拟类的部分方法,而其他方法保持不变。这种技术适用于需要模拟部分行为同时保留类的部分真实行为的情况。 - **创建partial mock**:使用`EasyMock.createPartialMock`方法来创建部分...

    easymock教程.pdf

    easymock教程 easymock是一种流行的mocking框架,用于单元测试中模拟依赖对象的行为。下面是关于easymock的详细知识点: ### easymock的基本概念 * Mock对象:是一种虚拟对象,模拟真实对象的行为,用于单元测试...

    easymock教程

    ### Easymock 教程知识点详述 #### 一、基本概念 ##### 1.1 Mock与Stub - **相同点**:Mock与Stub都用于实现系统隔离,即在测试过程中,用它们来替代次要对象(即依赖项),使得测试能够集中关注于主要测试对象的...

    easymock教程[归纳].pdf

    本教程详细介绍了Easymock的各种特性和使用方法,旨在帮助软件开发人员掌握这一工具。 1. **Mock和Stub的概念** - Mock对象是用于代替真实对象的虚拟对象,它在测试中按照预设的规则来响应调用,帮助验证方法是否...

    Learning EasyMock3.0 By Official Example

    - EasyMock Class Extension:允许对静态方法和 final 类进行模拟,扩展了 EasyMock 的使用范围。 - Callbacks:可以指定当模拟对象被调用时执行的回调函数,实现自定义行为。 - Partial Mocking:只对部分方法进行...

    EasyMock入门

    在入门EasyMock时,首先需要了解的是模拟(mocking)的概念。模拟是为测试目的创建对象,这些对象的行为是可以预定义的。通过模拟,我们可以确保测试只关注于我们想要测试的代码部分,而不是外部依赖的影响。...

    EasyMock与Mockito 使用

    - 使用`Mockito.mock(Class)`创建模拟对象。 - 使用`when(mockObject.someMethod()).thenReturn(someValue)`来设置方法的返回值。 - 测试时直接使用模拟对象,无需`replay`和`verify`步骤。 2. **高级特性** - ...

    EasyMock 实例

    EasyMock 的核心概念是模拟(Mocking)和期望(Expectations)。模拟是指创建一个对象的替代品,这个替代品的行为由测试代码来定义。而期望则是对模拟对象如何被调用的预设规则,包括方法调用的顺序、参数和返回值等...

    EasyMock介绍及安装方法

    EasyMock 可以 mock 接口和 java 类,但是 class mocking 有一些限制: 不能 mock 类的 final 方法。如果 final 方法被调用,则只能执行原有的正常代码。 不能 mock 类的 static 方法。同样如果 private 方法被调用...

    java easymock

    Java EasyMock是一个流行的模拟(mocking)工具,它在Java单元测试中扮演着重要的角色,尤其对于新手来说,是一个极好的学习资源。EasyMock通过创建虚拟的对象来模拟真实对象的行为,使得开发者可以在不依赖实际环境...

    powermock依赖jar文件.rar

    在实际项目中,我们需要根据具体使用的Mocking框架(如Mockito、EasyMock等)和测试运行器(如JUnit、TestNG等)选择正确的PowerMock模块,并将其与其他依赖的jar文件一起添加到项目的类路径中。这样,我们就可以...

    EasyMockTest

    NumberService mockService = EasyMock.createMock(NumberService.class); EasyMock.expect(mockService.add(2, 3)).andReturn(5); EasyMock.replay(mockService); Calculator calculator = new Calculator(); ...

    Mock.java.zip

    IntelliJ IDEA提供了强大的工具集来支持单元测试和Mocking,这包括内置的测试运行器以及对各种Mocking框架的集成,如Mockito和EasyMock。 **Mockito**是Java中最常用的Mocking框架之一,它提供了一种简洁的API来...

    powermock实战手册

    PowerMock是一个强大的Java单元测试框架,它扩展了其他Mocking库(如EasyMock)的功能,允许开发者模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器。这使得测试更加灵活,能够处理那些在传统...

    JMockit基础教程

    这种方法更接近传统的Mocking框架,如EasyMock。 2. **状态导向(State-oriented)**:使用`MockUp<GenericType>`类来改变类的实例状态。这种方式允许对类的行为进行全局修改,而不局限于特定方法的期望。 JMockit...

    PHP测试框架Shmock.zip

    Shmock(SHorthand for MOCKing)是 PHPUnit 创建 mocks 的平稳替代,使用 EasyMock 的 mock/replay 概念,但是又使用 mocking 定义的闭包范围。 示例代码: <?php  namespace Foo;  /** * Here's a ...

    UT总结(为完成版)

    - **Mocking Frameworks**: 包括Mockito、EasyMock等,这些框架用于创建和配置模拟对象。 - **Classloading Mechanism**: 用于处理类加载过程中的修改和替换。 - **Bytecode Manipulation Libraries**: 如ASM、CGLIB...

    powermock

    PowerMock 提供了与 JUnit 的紧密集成,通过注解如 `@RunWith(PowerMockRunner.class)` 和 `@PrepareForTest`,可以在 JUnit 测试类中使用 PowerMock 的功能。 7. **测试实例化过程**: PowerMock 还可以用来控制...

    powermock-demo:powermock演示

    PowerMock 是一个强大的 Java 模拟框架,它扩展了诸如 EasyMock 和 Mockito 这样的单元测试库的功能。在 Java 开发中,有时我们可能需要模拟静态方法、构造函数、final 类和方法、私有方法以及删除静态初始化器等,...

    jmockit

    JMockit是一个开源的Java库,它提供了模拟(mocking)和存根(stubbing)功能,支持Java平台上的静态方法、构造器、final类和方法、接口、枚举以及匿名类的模拟。这使得开发者可以在测试过程中控制被测试代码的行为...

Global site tag (gtag.js) - Google Analytics