当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

Mockito(一) --入门篇

发表于: 2013-12-09   作者:bijian1013   来源:转载   浏览:
摘要:         Mockito是一个针对Java的mocking框架,它与EasyMock和jMock很相似,但是通过在执行后校验什么已经被调用,它消除了对期望 行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。  &nb

        Mockito是一个针对Java的mocking框架,它与EasyMock和jMock很相似,但是通过在执行后校验什么已经被调用,它消除了对期望 行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。

        Mockito是现在比较流行的mock框架。

        什么是mock?说的直白一点,大家都知道unit test应该是尽可能独立的。对一个class的unit test不应该再和其他class有任何交互。

        假设现在有一个类,扫描一个目录并将找到的文件都上传到FTP server。该类对于不同的FTP响应(找不到FTP server 或 上传成功,或上传失败),有一些后续操作。在写这个类的UT时,我们就必须虚构出来一个FTP对象。这样在UT中,这个虚构的对象能够代替真正的FTP,对被测试类的调用做出一定的响应。从而知道被测试类是否正确的调用了FTP并做出一些正确的期望的响应,从而达到测试的目的。mock可以模拟各种各样的对象,从而代替真正的对象做出希望的响应。

        下面介绍mockito的基本使用方法,我们需要创建一个mock对象来代替真的对象,步骤如下:

        第一步:模拟对象,模拟对象使用mock()。

        第二步:指定mock对象被调用时的返回值,比如指定让mockFTP对象第一次被调用时返回"找不到FTP server",这一步一般称为stubbing。一般是when(mockedList.get(0)).thenReturn("first")的样子。

        第三步:验证被测试类是否正确工作是第三步,使用verify(),例如,验证当mockFTP对象返回"找不到FTP server"时,测试代码是否按要求重试。

一.引入mockito相关的类

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
    对于times、verify、when等,需通过如下静态方式引入
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
 二.模拟对象
// 模拟LinkedList 的对象  
LinkedList mockedList = mock(LinkedList.class);  
      
// 此时调用get方法,是会返回null,因为还没有对方法调用的返回值做模拟   
System.out.println(mockedList.get(999));  
 三. 模拟方法调用的返回值
// 模拟获取第一个元素时,返回字符串first  
when(mockedList.get(0)).thenReturn("first");  
  
// 此时打印输出first  
System.out.println(mockedList.get(0))
 四. 模拟方法调用抛出异常
// 模拟获取第二个元素时,抛出RuntimeException  
when(mockedList.get(1)).thenThrow(new RuntimeException());  
  
// 此时将会抛出RuntimeException  
System.out.println(mockedList.get(1)); 
         没有返回值类型的方法也可以模拟异常抛出:
doThrow(new RuntimeException()).when(mockedList).clear();
 五.模拟方法调用的参数匹配
// anyInt()匹配任何int参数,这意味着参数为任意值,其返回值均是element  
when(mockedList.get(anyInt())).thenReturn("element");
  
// 此时打印是element  
System.out.println(mockedList.get(999));
 六.验证方法调用次数
// 调用add一次  
mockedList.add("once");  
  
// 下面两个写法验证效果一样,均验证add方法是否被调用了一次  
verify(mockedList).add("once");  
verify(mockedList, times(1)).add("once");
       还可以通过atLeast(int i)和atMost(int i)来替代time(int i)来验证被调用的次数最小值和最大值。
七.收尾
        上面仅列举了一些常用的,更多用法和技巧还请详细参考: http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html。
        一些稍微复杂且实用一点的例子: http://gojko.net/2009/10/23/mockito-in-six-easy-examples/。

Mockito(一) --入门篇

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
准备工作 首先下载play http://www.playframework.com/download 解压到任意目录,将play根目录加入
一.摘要 二.前言 三.什么是jQuery jQuery是一套Javascript脚本库. 在我的博客中可以找到"Javascript
首先回顾一下JDK1.5之前的线程相关的知识: 1 线程的入门. 什么是线程,线程就是程序执行的线索,Java
PostgreSQL最强大的开源数据库,以前一直以为是mysql。可谓无知者,无畏也。井底之娃,一个八线城市
海量数据处理使用的大多是鼎鼎大名的hadoop或者hive,作为一个批处理系统,hadoop以其吞吐量大、自
安装composer http://my.oschina.net/xinson/blog/355184 如果你已经安装有 Composer 请确保使用的
ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以
我是ASP.NET MVC的新手,看了ASP.NET MVC和jQuery系列的几篇文章感觉不错,分享给大家,如果翻译的有
ViewFilpper是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以
在本篇中,您将学习如何在 SQL Server Data Tools (SSDT) 中创建报表服务器项目。 报表服务器项目用
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号