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

发表于:2010-8-03 13:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

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

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

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

  下面简单介绍下两种Mock测试框架:JMockhttp://www.jmock.org和Mockitohttp://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() {  
    }  
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号