一、什么是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管理的可以下载相关jar包导入classpath)

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mockito</groupId>
  4. <artifactId>mockito-all</artifactId>
  5. <version>1.8.5</version>
  6. <scope>test</scope>
  7. </dependency>
  8. </dependencies>
  1. import static org.mockito.Mockito.*;
  2. import java.util.List;
  3. import org.junit.Assert;
  4. import org.junit.Test;
  5. /**
  6. *
  7. * @author lzjun
  8. * @version 0.1
  9. * @date 2012-5-5
  10. * {@link http://weibo.com/u/1697702241}
  11. *
  12. */
  13. public class SimpleTest {
  14. @Test
  15. public void simpleTest(){
  16. //创建mock对象,参数可以是类,也可以是接口
  17. List<String> list = mock(List.class);
  18. //设置方法的预期返回值
  19. when(list.get(0)).thenReturn("helloworld");
  20. String result = list.get(0);
  21. //验证方法调用(是否调用了get(0))
  22. verify(list).get(0);
  23. //junit测试
  24. Assert.assertEquals("helloworld", result);
  25. }
  26. }

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

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

可对方法设定返回异常

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

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

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

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

  1. doNothing().doThrow(new RuntimeException("void exception")).when(list).clear();
  2. list.clear();
  3. list.clear();
  4. verify(list,times(2)).clear();

五、参数匹配器(Argument Matcher)

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

  1. @Test
  2. public void argumentMatcherTest(){
  3. List<String> list = mock(List.class);
  4. when(list.get(anyInt())).thenReturn("hello","world");
  5. String result = list.get(0)+list.get(1);
  6. verify(list,times(2)).get(anyInt());
  7. Assert.assertEquals("helloworld", result);
  8. }

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

  1. @Test
  2. public void argumentMatcherTest2(){
  3. Map<Integer,String> map = mock(Map.class);
  4. when(map.put(anyInt(),anyString())).thenReturn("hello");//anyString()替换成"hello"就会报错
  5. map.put(1, "world");
  6. verify(map).put(eq(1), eq("world")); //eq("world")替换成"world"也会报错
  7. }

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

  1. @Test
  2. public void verifyInvocate(){
  3. List<String> mockedList = mock(List.class);
  4. //using mock
  5. mockedList.add("once");
  6. mockedList.add("twice");
  7. mockedList.add("twice");
  8. mockedList.add("three times");
  9. mockedList.add("three times");
  10. mockedList.add("three times");
  11. /**
  12. * 基本的验证方法
  13. * verify方法验证mock对象是否有没有调用mockedList.add("once")方法
  14. * 不关心其是否有返回值,如果没有调用测试失败。
  15. */
  16. verify(mockedList).add("once");
  17. verify(mockedList, times(1)).add("once");//默认调用一次,times(1)可以省略
  18. verify(mockedList, times(2)).add("twice");
  19. verify(mockedList, times(3)).add("three times");
  20. //never()等同于time(0),一次也没有调用
  21. verify(mockedList, times(0)).add("never happened");
  22. //atLeastOnece/atLeast()/atMost()
  23. verify(mockedList, atLeastOnce()).add("three times");
  24. verify(mockedList, atLeast(2)).add("twice");
  25. verify(mockedList, atMost(5)).add("three times");
  26. }

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

参考:

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

from: https://liuzhijun.iteye.com/blog/1512780

5分钟了解Mockito的更多相关文章

  1. [转载]5分钟了解Mockito

    原文链接: http://liuzhijun.iteye.com/blog/1512780/ 5分钟了解Mockito 博客分类: Open SourceJava 一.什么是mock测试,什么是moc ...

  2. spring中使用mockito

    1 mockito介绍和入门 官方:https://github.com/mockito/mockito 入门: 5分钟了解Mockito http://liuzhijun.iteye.com/blo ...

  3. 单元测试系列:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  4. 单元测试系列之五:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  5. Mockito 简介

    Mockito 是一种 Java Mock 框架,主要是用来做 Mock 测试,它可以模拟任何 Spring 管理的 Bean.模拟方法的返回值.模拟抛出异常等等,在了解 Mockito 的具体用法之 ...

  6. java mock

    一篇文章: 5分钟了解Mockito 一.什么是mock测试,什么是mock对象? 先来看看下面这个示例: 从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例. ...

  7. 基于mockito做有效的单元测试

    概述 本文讲解的主要是有效和单元的思想,并不是说如何编写单元测试,用于改善和提高开发效率.编码风格.编码可读性和单测效率,不盲目追求覆盖率. 背景 现在很多单元测试只是利用@Test注解把代码或者整个 ...

  8. 【NLP】十分钟快览自然语言处理学习总结

    十分钟学习自然语言处理概述 作者:白宁超 2016年9月23日00:24:12 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛.笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文 ...

  9. iOS之计算上次日期距离现在多久, 如 xx 小时前、xx 分钟前等

    /**  *  计算上次日期距离现在多久  *  *  @param lastTime    上次日期(需要和格式对应)  *  @param format1     上次日期格式  *  @para ...

随机推荐

  1. P1736 创意吃鱼法 图的DP

    题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...

  2. 037 SparkSQL ThriftServer服务的使用和程序中JDBC的连接

    一:使用 1.实质 提供JDBC/ODBC连接的服务 服务运行方式是一个Spark的应用程序,只是这个应用程序支持JDBC/ODBC的连接, 所以:可以通过应用的4040页面来进行查看操作 2.启动服 ...

  3. c#double类型保留百分号后两位,且禁止四舍五入的方法

    double percent = Convert.ToDouble(50002.3) / Convert.ToDouble(50002.5) - 0.00005; string result = pe ...

  4. 初识thinkphp(4)

    这次内容是数据库的使用方法 因为在第一章讲过就是拿index这个文件写的数据库的访问,这次实验我使用文件是系统默认的首页 配置的内容也在那里有提过就不重发戳图了. 数据库按照手册上的建议建了3行的内容 ...

  5. k8s+Jenkins+GitLab-自动化部署asp.net core项目

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 此文阅读目录: 1.闲聊 ...

  6. java过滤器、监听器、拦截器机制

    一.过滤器 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

  7. [Java]Servlet&JSP

    在这里学习Servlet和JSP >> Servlet&JSP的那些事儿 >> servlet [书籍] 孙鑫的<Servlet/JSP深入详解:基于Tomcat ...

  8. Codeforces Round #396 (Div. 2) C. Mahmoud and a Message dp

    C. Mahmoud and a Message 题目连接: http://codeforces.com/contest/766/problem/C Description Mahmoud wrote ...

  9. 从客户端浏览器直传文件到Storage

    关于上传文件到Azure Storage没有什么可讲的,不论我们使用哪种平台.语言,上传流程都如下图所示: 从上图我们可以了解到从客户端上传文件到Storage,是需要先将文件上传到应用服务上,然后再 ...

  10. spring-boot 速成(3) actuator

    actuator 通过暴露一系列的endpoints可以让开发者快速了解spring boot的各项运行指标,比如:线程数,jvm剩余内存等一系列参数. 启用方法很简单,参考下面: dependenc ...