`
obullxl
  • 浏览: 183394 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

单元测试框架JMock与Mockito的用法比较

    博客分类:
  • Java
阅读更多

我们都有这种经验,测试在我们软件编码过程中占据了大部分时间,有时候觉得软件业务代码好写,但测试代码却难写了,单元测试是把自己的代码交托给测试同学和其他同学前的承诺。

为了获得更好的代码质量,我们一般都会用几好种工具,其中FindBugs和Emma(http://update.eclemma.org)就是常用的。

在测试与其它系统有交互的功能块,并且其它系统的稳定性未知的情况下,Mock就得派上用场了,否则测试起来极其吃力,并且效率低下。

下面简单介绍下两种Mock测试框架:JMock【http://www.jmock.org】和Mockito【http://www.mockito.org】。

一、前提说明

两个类:一个被Mock的对象(MayMockObject),一个被测试的对象(MainTstObject)。
很明显,我们的任务是测试MainTstObject,而该类引用了MayMockObject,为了测试的进行,我们模拟MayMockObject的实例。

测试用例类:MainTstObjectJMockTest和MainTstObjectMockitoTest。

二、依赖加入

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
    <version>4.4</version>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <scope>test</scope>
    <version>1.8.5</version>
</dependency>
<dependency>
    <groupId>jmock</groupId>
    <artifactId>jmock</artifactId>
    <scope>test</scope>
    <version>2.5.1</version>
</dependency>
 



当然,如果工程不是基于Maven构架的,可以直接加入相应的Jar也行。

三、外接接口(将被Mock的对象)

public interface MayMockObject {
    public String getString(String str);
}
 



四、功能类(被测试的类)

public class MainTstObject {
    private MayMockObject mayMockObject; // 引用了外接接口

    public String create(String str1, String str2) {
        return str1 + this.mayMockObject.getString(str2);
    }

    public void setMayMockObject(MayMockObject mayMockObject) {
        this.mayMockObject = mayMockObject;
    }
}
 



五、JMock的测试用例

public class MainTstObjectJMockTest {
    private Mockery       context = new JUnit4Mockery();

    private MayMockObject mayMockObject;
    private MainTstObject mainTstObject;

    @Before
    public void setUp() {
        this.mayMockObject = this.context.mock(MayMockObject.class); // Mock了外接接口

        this.mainTstObject = new MainTstObject();
        this.mainTstObject.setMayMockObject(this.mayMockObject);
    }

    @Test
    public void process() {
        final String str1 = "Mockito返回字符串。";
        final String str2 = "Mockito返回字符串。";

        this.context.checking(new Expectations() {
            {
                oneOf(mayMockObject).getString(str2);
                will(returnValue("")); // Mock返回值
               
                // allowing(mayMockObject).getString(with(any(String.class)));
                // will(returnValue(""));
            }
        });
       
        String ret = this.mainTstObject.create(str1, str2);
        Assert.assertEquals(ret, str1);
    }

    @After
    public void tearDown() {
    }
}
 



六、Mockito的测试用例

public class MainTstObjectMockitoTest {
    // 指定Mock的对象
    @Mock
    private MayMockObject mayMockObject;
   
    private MainTstObject mainTstObject;
   
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this); // 声明测试用例类
       
        this.mainTstObject = new MainTstObject();
        this.mainTstObject.setMayMockObject(this.mayMockObject);
    }
   
    @Test
    public void process() {
        String str1 = "Mockito返回字符串。";
        String str2 = "Mockito返回字符串。";
       
        Mockito.when(this.mayMockObject.getString(str2)).thenReturn(""); // Mock返回值
       
        String ret = this.mainTstObject.create(str1, str2);
        Assert.assertEquals(ret, str1);
    }
   
    @After
    public void tearDown(){
    }
}
 



七、最后

从两个测试用例可以看出,JMock和Mockito在用法上的一些区别:

1、对于要Mock的对象,JMock要显示指出来【this.mayMockObject = this.context.mock(MayMockObject.class);】;
    而Mockito只是简单加上注释【@Mock】,然后声明下测试用例类即可【MockitoAnnotations.initMocks(this);】。

2、对于方法的模拟,JMock显得更加复杂了【this.context.checking(new Expectations() {
        {
            oneOf(mayMockObject).getString(str2);
            will(returnValue(""));
        }
    });】
    而Mockito只要简单的一行代码就行【Mockito.when(this.mayMockObject.getString(str2)).thenReturn("");】。

从上可以看出,Mockito的代码行更少,更加简洁,个人比较喜欢用Mockito,简洁易记!

另外需要注意的是:JMock只能Mock接口,也就是上面的例子中【MayMockObject】只能为接口,不能为实体类;而Mockito就没有这个限制。
当然,我们既然用Mock,就是因为只知接口,而不知其具体实现,这样说来,JMock只能Mock接口不能算是Mockito的一个优点了。

===========================================
如有批评、指教、疑惑,请:obullxl@163.com
祝大家使用JAVA愉快!

 

同URL:http://hi.baidu.com/obullxl/blog/item/645bf5c4f17f8fa48226acef.html

 

1
0
分享到:
评论
1 楼 steafler 2010-08-30  
不错大介绍,不过最近用这个用着有些问题拉。

相关推荐

    JMOCK 帮助 网页 文档

    JMock可以与其他单元测试框架如JUnit、TestNG等无缝集成,提供更加全面的测试支持。它也可以与Mockito、PowerMock等其他模拟库一起使用,以应对更复杂的测试需求。 总结来说,JMock是一个强大且灵活的Java模拟工具...

    JMock JARs+docs

    JMock可以与多种测试框架集成,如JUnit、TestNG等,也可以与其他模拟库如EasyMock、Mockito配合使用,以满足不同测试需求。 总之,JMock是Java开发者进行单元测试的重要工具,它通过提供模拟和预期机制,帮助确保...

    jmock-2.4.0-jars.zip

    jMock可以与Mockito、EasyMock等其他模拟框架配合使用,形成互补,提供更全面的测试解决方案。同时,它也可以与Mockrunner、PowerMock等工具结合,用于模拟静态方法、final类等特殊情况。 总结来说,jMock 2.4.0-...

    teste-unitario:使用单元测试框架的例子

    本文将详细探讨如何使用三种流行的Java单元测试框架:jMock、Mockito和EasyMock,并通过"teste-unitario:使用单元测试框架的例子"这个项目,帮助你理解和应用这些工具。 1. **jMock**:jMock是一个用于创建和执行...

    Mocks, Mockito, and Spock

    3. **非期望-执行-验证模式**:与EasyMock或jMock等框架不同,Mockito采用的是非期望-执行-验证模式,即先执行业务逻辑再验证模拟对象的交互情况。 #### 如何在Mockito中创建Mocks 在Mockito中创建Mocks非常简单,...

    jmock-overview.rar_overview

    JMock通常与Mockito、EasyMock等其他Java模拟框架相比较。虽然它们的目标相似,但JMock更专注于模拟对象的行为和交互,而不仅仅是方法调用。此外,JMock使用领域特定语言(DSL)来定义期待,使得代码更具可读性。 *...

    powermock 资料_杂

    PowerMock是一种基于现有单元测试框架如EasyMock和Mockito的扩展工具,通过利用自定义类加载器和字节码操纵技术,PowerMock能够突破传统单元测试工具的限制,提供对静态方法、构造方法、私有方法、final方法以及系统...

    maven+jmock

    在传统的单元测试中,我们通常会使用诸如Mockito这样的工具来创建模拟对象,以隔离被测试代码和其依赖。JMock不仅提供了模拟对象的功能,还能记录和验证对象的方法调用,这对于测试驱动开发(TDD)和行为驱动开发...

    junit单元测试

    - 常用的模拟框架有Mockito、jMock等。 - 使用模拟对象可以帮助开发者专注于测试单一组件的行为,而不受其他组件的影响。 - **覆盖测试**: - 覆盖测试是一种度量测试完整性的方法,通常通过统计测试代码覆盖率...

    Java单元测试入门

    使用Mockito进行单元测试时,可以遵循“given when then”的模式来命名测试方法,并且建议一个测试案例中只包含一个断言。 Mockito的常用注解和方法包括: - @Mock:用来声明一个Mock对象。 - @InjectMocks:自动...

    开源测试技术.pdf

    - **与其他工具的比较**: 与PowerMock、Mockito等其他Mock框架相比,jMock提供了更多灵活的配置选项。 #### 三、Selenium:Web应用自动化测试工具 - **定义**: Selenium是一个用于Web应用程序的自动化测试工具。 -...

    mock

    本文将深入探讨Mock的概念及其在Struts2与Spring框架中的应用,同时也会涉及到JUnit和EasyMock等单元测试工具。 Mock技术的核心是创建虚拟对象,这些对象的行为可以被精确地控制,从而模拟真实系统中的协作对象。在...

    Eclipse测试

    5. **JMock和Mockito**:在Eclipse中进行单元测试时,模拟对象技术是必不可少的。JMock和Mockito是两个流行的Java模拟框架,它们允许开发者创建和控制对象的行为,以便在隔离环境中测试代码。 6. **持续集成**:...

    Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架

    在实际应用中,Jmockdata与流行的测试框架如JUnit、TestNG等结合使用,可以大大提高测试代码的编写速度和质量。比如,通过集成Mockito这样的模拟库,可以进一步模拟对象的行为,使得测试更加全面和深入。 在项目...

    GMock——groovy下的mock工具

    - **JUnit**:是一个流行的 Java 单元测试框架,虽然不直接提供 mock 功能,但可以与 EasyMock 或 Mockito 等工具结合使用。 - **EasyMock**:是另一个 Java 的模拟库,提供简单的 API 来创建和管理 mock 对象,但它...

    Mock

    2. **Mocking框架比较**:对比不同编程语言中的Mocking库,比如`Mockito`、`EasyMock`、`JMock`等。 3. **基本用法**:展示如何创建和配置Mock对象,以及如何设置预期行为。 4. **使用场景**:讲解Mock在测试中的...

    mock学习交流

    Mock技术在软件开发中扮演着重要的角色,尤其是在单元测试和集成测试中。它允许开发者模拟复杂的依赖关系,以便测试特定的代码片段而不受其他部分的影响。在这个“mock学习交流”主题中,我们将深入探讨Java环境下的...

    文件下载

    源码部分可能展示了如何在实际项目中创建和使用mock对象,而工具部分可能介绍了流行的mocking框架,如上述的Moq和Mockito,以及其他如PowerMock、JMock等。 在单元测试中,mock对象常用于测试驱动开发(TDD)和行为...

    Java-Programs:用Java测试程序

    在这个主题中,我们将深入探讨Java编程中的测试实践,包括单元测试、集成测试以及如何使用各种Java测试框架。 在Java编程中,测试是确保代码质量、可维护性和可靠性的重要步骤。主要的测试方法有: 1. **单元测试*...

Global site tag (gtag.js) - Google Analytics