`
zbg1983
  • 浏览: 39186 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jmock使用总结

阅读更多
jmock是写单元测试时需要生成mock对象时很好的辅助库。

软件地址: http://www.jmock.org

本文是我今天摸索使用jmock(v2.4)的总结。不是初学指南,当你入门了,我想可以作为简单手册。是原版文档补充。

一般使用模式:
生成Mockery对象,可以全局共享
Java代码
Mockery context = new JUnit4Mockery() {  
        {     
            //声明针对类mock(采用cglib生成子类),final方法无法mock,针对接口则会采用动态代理,不需要声明下面的代码  
            setImposteriser(ClassImposteriser.INSTANCE);  
        }  
    }; 

Mockery context = new JUnit4Mockery() {
{
//声明针对类mock(采用cglib生成子类),final方法无法mock,针对接口则会采用动态代理,不需要声明下面的代码
setImposteriser(ClassImposteriser.INSTANCE);
}
};


例子
Java代码
final UserDAO dao = context.mock(UserDAO.class);  
          
        final Integer id1 = 1;        
        final User user1 = new User();  
        user1.setId(1);  
        user1.setUserId(1);  
        user1.setName("1");  
          
        final Integer id2 = 2;        
        final User user2 = new User();  
        user2.setId(2);  
        user2.setUserId(2);  
        user2.setName("2");  
          
        context.checking(new Expectations(){  
            {     
                //one表示调用一次。  
                one(dao).find(id1);will(returnValue(user1));  
                //再用另一参数做一次mock  
                one(dao).find(id2);will(returnValue(user2));  
                //可以忽略mock对象  
                //ignoring(dao);  
            }  
        });  

final UserDAO dao = context.mock(UserDAO.class);

final Integer id1 = 1;
final User user1 = new User();
user1.setId(1);
user1.setUserId(1);
user1.setName("1");

final Integer id2 = 2;
final User user2 = new User();
user2.setId(2);
user2.setUserId(2);
user2.setName("2");

context.checking(new Expectations(){
{
//one表示调用一次。
one(dao).find(id1);will(returnValue(user1));
//再用另一参数做一次mock
one(dao).find(id2);will(returnValue(user2));
//可以忽略mock对象
//ignoring(dao);
}
});

context.checking(new Expectations(){中的语法总结

1.
Java代码
context.checking(new Expectations(){  
            {  
                //另一种连续调用: 同个方法同样参数,调用多次返回值各不同,声明了调用次序  
                atLeast(1).of(dao).find(id1);  
                will(onConsecutiveCalls(  
                        returnValue(user1),  
                        returnValue(user2)));  
            }  
        }); 

context.checking(new Expectations(){
{
//另一种连续调用: 同个方法同样参数,调用多次返回值各不同,声明了调用次序
atLeast(1).of(dao).find(id1);
will(onConsecutiveCalls(
returnValue(user1),
returnValue(user2)));
}
});

2.
Java代码
context.checking(new Expectations(){  
            {     
                allowing(dao).find(id);will(throwException(new FindException()));//也可以throw RuntimeException  
            }             
        }); 

context.checking(new Expectations(){
{
allowing(dao).find(id);will(throwException(new FindException()));//也可以throw RuntimeException
}
});

3.
Java代码
context.checking(new Expectations(){  
            {     
                //allowing不限定调用次数  
                allowing(dao).find(id);will(returnValue(user));  
                never(dao).findByUserId(userId);  
                //下面两行是从jmock官网copy下来的,可以为相同的方法用不同的参数mock多次  
                //one(calculator).load("x"); will(returnValue(10));  
                //never(calculator).load("y");  
            }  
        }); 

context.checking(new Expectations(){
{
//allowing不限定调用次数
allowing(dao).find(id);will(returnValue(user));
never(dao).findByUserId(userId);
//下面两行是从jmock官网copy下来的,可以为相同的方法用不同的参数mock多次
//one(calculator).load("x"); will(returnValue(10));
//never(calculator).load("y");
}
});

4.
Java代码
context.checking(new Expectations(){  
            {     
                //可以在mock方法时做一些参数操作  
                allowing(srv).findUser(with(lessThan(10)));will(returnValue(user1));  
                allowing(srv).findUser(with(greaterThan(10)));will(returnValue(user2));  
            }  
        }); 

context.checking(new Expectations(){
{
//可以在mock方法时做一些参数操作
allowing(srv).findUser(with(lessThan(10)));will(returnValue(user1));
allowing(srv).findUser(with(greaterThan(10)));will(returnValue(user2));
}
});

5.
Java代码
 
context.checking(new Expectations(){  
            {  
                //inSequence(sequence),会把声明的方法放进序列,调用次序必须符合声明次序  
                one(dao).find(id1);will(returnValue(user1));inSequence(sequence);  
                one(dao).find(id2);will(returnValue(user2));inSequence(sequence);  
            }  
        });  
 
        //调用次序必须符合声明次序  
        assertEquals(user1,dao.find(id1));  
        assertEquals(user2,dao.find(id2)); 
分享到:
评论

相关推荐

    jmock2.5.1.zip

    总结来说,jMock 2.5.1是一个强大的模拟工具,它使开发者能够在单元测试中有效地控制和验证对象行为,提高测试覆盖率和代码质量。通过阅读jMock 2.5.1.chm的帮助文档,开发者可以深入理解并掌握这一工具,从而在实践...

    JMock

    要在项目中使用JMock,首先需要添加相应的依赖。对于Maven项目,可以在pom.xml文件中加入以下依赖: ```xml <groupId>org.jmock <artifactId>jmock-junit4 <version>2.8.4 <scope>test ``` 同时,由于JMock...

    jmock-2.6.0-jars

    总结来说,`jmock-2.6.0-jars`是一个包含`jmock`库的压缩包,它提供了进行交互式单元测试的工具,特别是对于那些依赖于其他对象交互的代码。结合源代码和文档,开发者可以深入理解`jmock`的工作原理,并在自己的项目...

    JMOCK 帮助 网页 文档

    总结来说,JMock是一个强大且灵活的Java模拟工具,它使得单元测试更加可控,有助于编写更健壮、可维护的代码。理解并熟练使用JMock,能够显著提升你的测试效率和代码质量。通过阅读和研究网上的博客和文档,你可以...

    jmock-2.5.1-javadoc

    总结,jMock 2.5.1作为一款强大的模拟工具,为Java单元测试带来了灵活性和可控制性。它简化了测试代码,提高了测试覆盖率,帮助开发者确保代码的质量。通过熟练掌握jMock,开发者可以更加自信地面对复杂系统的测试...

    使用 FactoryBean结合Jmock实现动态Mock类的注入

    总结来说,通过结合`FactoryBean`和Jmock,我们可以方便地在Spring容器中动态地注入模拟对象,这对于单元测试和隔离被测试代码非常有帮助。这种技术可以有效地避免真实依赖对测试的影响,提高测试的效率和覆盖率。在...

    jmock2.5.1和easymock3.0

    总结,JMock 2.5.1和EasyMock 3.0为Java开发者提供了强大而灵活的单元测试工具,通过模拟对象的行为,可以帮助我们编写出更加健壮、可靠的代码。结合JUnit,这两个框架可以极大地提升测试效率和质量,是每个Java...

    jMock基本使用方法

    ### jMock基本使用方法 #### 一、简介 jMock 是一个流行的 Java 框架,用于支持单元测试,特别是对于模拟对象(mock objects)的支持。通过 jMock,开发人员可以轻松地创建模拟对象来替代实际的对象依赖,从而在...

    软件测试资料集合,jtest,jmock

    `jmock-2.6.0-RC2-javadoc.zip`和`jmock-2.5.1-javadoc.zip`包含的是`jmock`的API文档,可以帮助开发者理解和使用其API。`jmock-2.6.0-RC2-jars.zip`和`jmock-2.5.1-jars.zip`则包含了相应的库文件,可以直接在项目...

    JMock学习文档分享

    总结,JMock是一个强大的测试工具,它通过模拟对象的行为,使得单元测试更加灵活和精确。掌握其核心概念和使用方法,可以帮助开发者编写出更加健壮、可维护的代码。在实际开发中,合理运用JMock可以显著提高测试覆盖...

    jmock-2.4.0-jars.zip

    总结来说,jMock 2.4.0-jars.zip是提高单元测试效率和质量的重要工具,通过其强大的模拟和验证功能,开发者可以编写出更加健壮的测试代码,确保软件的稳定性和可靠性。对于任何希望优化测试流程的Java开发团队而言,...

    jmock-overview.rar_overview

    总结,JMock是Java测试中的强大工具,通过模拟对象的行为,它能够帮助开发者编写更稳定、独立的单元测试。理解并熟练运用JMock,将有助于提高代码质量,减少维护成本。在实际工作中,结合TDD(测试驱动开发)原则,...

    jmock-2.6.0-RC2-jars.rar

    总结来说,jMock 2.6.0-RC2是Java单元测试的重要工具,其强大的模拟对象功能和改进的API为开发者提供了更高的测试灵活性。熟练掌握jMock,不仅可以提高代码质量,还能加快开发进度,降低维护成本。在日常开发中,...

    JMock学习资料

    1. **创建模拟对象**:使用JMock API创建一个模拟对象,这个对象将代表你在测试中需要模拟的真实对象。 2. **定义期望**:在测试的setup阶段,设置模拟对象的方法调用期望。你可以指定方法何时被调用、调用次数、...

    SimpleHotel.zip

    总结来说,JMock提供了一种强大的工具,使开发者能够编写出隔离且易于维护的测试代码。通过理解并应用“SimpleHotel.zip”压缩包中的JMock测试脚本,你可以开始自己的JMock学习之旅,进一步提升你的单元测试技能,...

    mock

    这两个文件可能详细介绍了如何在JUnit测试中使用jMock。 5. `如何进行Struts测试.html`和`浅谈Mock和基于Spring容器管理事务的测试.html`:这些文件可能讨论了Struts2的测试策略,包括如何在测试中结合Mock技术和...

    Mock4JS-开源

    总结起来,Mock4JS是JavaScript世界里一个强大的Mock库,它为熟悉JMock的开发者提供了一种平滑过渡到JavaScript测试的途径。通过模拟对象和验证机制,Mock4JS帮助开发者编写更健壮、更易于维护的代码,从而提升软件...

    junit4.12.zip和依赖的jar包

    总结来说,Junit4.12及其依赖包是Java开发中的重要工具,它们为编写高效、可靠的单元测试提供了坚实的基础。通过深入理解和熟练运用这些库,开发者能够更好地保证代码质量,提升软件的稳定性和可维护性。

Global site tag (gtag.js) - Google Analytics