5分钟了解Mockito(转载)

一、什么是mock测试,什么是mock对象?


先来看看下面这个示例:

从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。


一种替代方案就是使用mocks

从图中可以清晰的看出

mock对象就是在调试期间用来作为真实对象的替代品。

mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。

知道什么是mock测试后,那么我们就来认识一下mock框架---Mockito


二、什么是Mockito

除了有一个好记的名字外,Mockito尝试用不一样的方法做mocking测试,是简单轻量级能够替代EasyMock的框架。使用简单,测试代码可读性高,丰富的文档包含在javadoc中,直接在IDE中可查看文档,实例,说明。更多信息:http://code.google.com/p/mockito/


三、Stub和Mock

相同点:Stub和Mock对象都是用来模拟外部依赖,使我们能控制。

不同点:而stub完全是模拟一个外部依赖,用来提供测试时所需要的测试数据。而mock对象用来判断测试是否能通过,也就是用来验证测试中依赖对象间的交互能否达到预期。在mocking框架中mock对象可以同时作为stub和mock对象使用,两者并没有严格区别。 更多信息:http://martinfowler.com/articles/mocksArentStubs.html


四、mockito入门实例

Maven依赖:(没用maven管理的直接忽略)


Xml代码

<dependencies>     

<dependency>     

<groupId>org.mockito</groupId>     

<artifactId>mockito-all</artifactId>     

<version>1.8.5</version>     

<scope>test</scope>     

</dependency>     

</dependencies>  


Java代码

import static org.mockito.Mockito.*;   


import java.util.List;   


import org.junit.Assert;   

import org.junit.Test;   


/** 

* @author lzjun 

* @version 0.1 

* @date 2012-5-5 

* {@link http://weibo.com/u/1697702241} 

 */  

public class SimpleTest {   


    @Test  

    public void simpleTest(){   


        //创建mock对象,参数可以是类,也可以是接口   

        List<String> list = mock(List.class);   


        //设置方法的预期返回值   

        when(list.get(0)).thenReturn("helloworld");   


        String result = list.get(0);   


        //验证方法调用(是否调用了get(0))   

        verify(list).get(0);   


        //junit测试   

        Assert.assertEquals("helloworld", result);   

    }   

}  

好了,五分钟差不多了,还想继续了解那就可以往下面看


创建mock对象不能对final,Anonymous ,primitive类进行mock。


可对方法设定返回异常


Java代码

when(list.get(1)).thenThrow(new RuntimeException("test excpetion"));  


stubbing另一种语法(设置预期值的方法),可读性不如前者

Java代码

doReturn("secondhello").when(list).get(1);  

没有返回值的void方法与其设定(支持迭代风格,第一次调用donothing,第二次dothrow抛出runtime异常)

Java代码

doNothing().doThrow(new RuntimeException("void exception")).when(list).clear();   

list.clear();   

list.clear();   

verify(list,times(2)).clear();  


五、参数匹配器(Argument Matcher)

Matchers类内加你有很多参数匹配器  anyInt、anyString、anyMap.....Mockito类继承于Matchers,Stubbing时使用内建参数匹配器,下例:


Java代码

@Test  

public void argumentMatcherTest(){   


    List<String> list = mock(List.class);   


    when(list.get(anyInt())).thenReturn("hello","world");   


    String result = list.get(0)+list.get(1);   


    verify(list,times(2)).get(anyInt());   


    Assert.assertEquals("helloworld", result);   


}  


 需要注意的是:如果使用参数匹配器,那么所有的参数都要使用参数匹配器,不管是stubbing还是verify的时候都一样。


Java代码

@Test  

public void argumentMatcherTest2(){   


    Map<Integer,String> map = mock(Map.class);   

    when(map.put(anyInt(),anyString())).thenReturn("hello");//anyString()替换成"hello"就会报错   

    map.put(1, "world");   

    verify(map).put(eq(1), eq("world")); //eq("world")替换成"world"也会报错   


}   


 六、方法调用的验证(具体的调用次数、至少一次,一次也没有)


Java代码

@Test  

public void verifyInvocate(){   


    List<String> mockedList = mock(List.class);   

    //using mock   

     mockedList.add("once");   

     mockedList.add("twice");   

     mockedList.add("twice");   


     mockedList.add("three times");   

     mockedList.add("three times");   

     mockedList.add("three times");   


     /** 

* 基本的验证方法 

* verify方法验证mock对象是否有没有调用mockedList.add("once")方法 

* 不关心其是否有返回值,如果没有调用测试失败。 

      */  

     verify(mockedList).add("once");    

     verify(mockedList, times(1)).add("once");//默认调用一次,times(1)可以省略   



     verify(mockedList, times(2)).add("twice");   

     verify(mockedList, times(3)).add("three times");   


     //never()等同于time(0),一次也没有调用   

     verify(mockedList, times(0)).add("never happened");   


     //atLeastOnece/atLeast()/atMost()   

     verify(mockedList, atLeastOnce()).add("three times");   

     verify(mockedList, atLeast(2)).add("twice");   

     verify(mockedList, atMost(5)).add("three times");   


}  



一次写不完,慢慢分析。。。

参考:

http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html

http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html

http://wenku.baidu.com/view/8def451a227916888486d73f.html

http://qiuguo0205.iteye.com/blog/1443344

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,861评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,263评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,033评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,999评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,000评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,483评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,850评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,827评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,366评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,404评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,525评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,130评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,853评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,293评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,426评论 1 276
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,082评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,590评论 2 366

推荐阅读更多精彩内容

  • 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试。 如果你不熟悉 JUnit,请查看下...
    会飞的大象_阅读 2,701评论 0 4
  • Mockito简介什么是mock?在软件开发的世界之外, "mock"一词是指模仿或者效仿。 因此可以将“mock...
    燕京博士阅读 3,564评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,748评论 18 139
  • 在博客Android单元测试之JUnit4中,我们简单地介绍了:什么是单元测试,为什么要用单元测试,并展示了一个简...
    水木飞雪阅读 9,491评论 4 18
  • 十月读书打卡第一次,读的是《假如给我三天光明》。大概内容是讲是作者在失去光明的时候做很多事情不方便,如果有了光明,...
    盛聿洺阅读 178评论 0 1