一、什么是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)
- <dependencies>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <version>1.8.5</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- 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。
可对方法设定返回异常
- when(list.get(1)).thenThrow(new RuntimeException("test excpetion"));
stubbing另一种语法(设置预期值的方法),可读性不如前者
- doReturn("secondhello").when(list).get(1);
没有返回值的void方法与其设定(支持迭代风格,第一次调用donothing,第二次dothrow抛出runtime异常)
- 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时使用内建参数匹配器,下例:
- @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的时候都一样。
- @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"也会报错
- }
六、方法调用的验证(具体的调用次数、至少一次,一次也没有)
- @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
转自:http://liuzhijun.iteye.com/blog/1512780
相关推荐
5. **集合框架**:深入理解ArrayList、LinkedList、HashSet、HashMap等集合类的使用,以及它们之间的性能差异和适用场景。 6. **多线程**:学习如何创建和管理线程,理解同步机制(如synchronized关键字、Lock接口...
- Mock测试:了解Mockito等模拟对象测试工具。 11. **Android最新技术**: - Jetpack:包括Room、Lifecycle、Navigation等,理解其带来的开发便利性。 - Kotlin:了解Kotlin特性,如协程、高阶函数等,以及与...
还有可能涉及构建工具Gradle的配置与优化,以及测试工具如JUnit和Mockito的运用。了解和熟练掌握这些工具能帮助开发者实现快速开发,高效调试,以及自动化工作流程。 除此之外,合集还可能包含了针对Android开发者...
5. **事务管理**:Spring的AOP可以用来处理事务,定义事务边界并控制事务的传播行为。 6. **测试**:利用JUnit和Mockito等工具对SSH框架中的各个组件进行单元测试和集成测试。 在提供的压缩包文件中,"ssh2.exe...
- JUnit和Mockito:熟悉单元测试,掌握断言和模拟对象的使用。 以上这些知识点是Java面试中常见的主题,也是Java开发者应具备的基础技能。在华为的面试中,除了理论知识,面试官也可能关注候选人的实际项目经验、...
- Android体系结构:了解Android系统的五层架构(Linux内核、硬件抽象层、系统运行库、应用程序框架、应用程序)。 - Activity生命周期:掌握启动、暂停、恢复、停止和销毁等状态及其转换。 - Intent:理解Intent...
- 单元测试:使用JUnit和Mockito进行代码单元测试。 - UI测试:了解Espresso和UI Automator,进行UI自动化测试。 以上内容只是冰山一角,真正的Android面试还会涉及到更多深度和广度的知识点,如NDK开发、Android...
了解Mockito框架的基本用法,学习如何模拟对象的行为。 #### 第七阶段:实战项目 21. **实战项目开发** - **项目规划**:根据需求分析和设计文档来规划项目的整体架构和技术选型。 - **编码实现**:按照设计文档...
2. 测试:单元测试、集成测试、压力测试的基本概念,掌握JUnit、Mockito等工具。 3. 设计模式:了解常见的23种设计模式,如工厂模式、单例模式、装饰器模式等。 七、框架与技术栈 1. 前端框架:React、Vue、Angular...
【标题】"Java解惑(转)" 涉及到的IT知识点主要集中在Java编程语言的理解和常见问题解决上,这通常包括语法、类库、框架、编程实践等多个方面。以下将详细介绍这些知识点: 1. **Java基础语法**:Java是一种强类型、...
15. **单元测试与Mockito**:学习如何编写单元测试,以及使用Mockito进行依赖注入和模拟测试。 以上知识点构成了安卓开发的基础框架,通过深入学习和实践,可以逐步成为一名合格的安卓开发者。这份笔记是宝贵的自学...
5. **Spring框架**:Spring是Java领域最流行的框架之一,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)、事务管理等,对于构建企业级Web应用非常有用。如果项目使用了Spring,那么理解其核心概念和实践将...
- CXF支持单元测试和集成测试,如使用JUnit和Mockito进行服务端测试,使用HttpClient进行客户端测试。 - 将CXF服务集成到持续集成系统(如Jenkins、Travis CI),确保代码质量与服务稳定性。 通过深入学习和实践...
16. **单元测试与Mock**:了解如何编写JUnit和Espresso测试,以及如何使用Mockito进行模拟对象测试。 17. **Kotlin**:作为Android的首选语言,理解Kotlin的基础语法、协程和Anko库的应用。 18. **Jetpack组件**:...
5. **LiveData 和 Room**:作为 Android Jetpack 组件,LiveData 用于创建可观察的数据对象,Room 提供了一种更友好的 SQL 接口来访问数据库,它们是现代 Android 开发中的重要工具。 6. **ViewModel 和 LiveData**...
- 单元测试:JUnit和Mockito等工具进行代码单元测试。 - UI测试:Espresso和Instrumentation测试,确保界面行为正确。 - 性能测试:MonkeyRunner、Systrace、Traceview等工具进行性能分析。 - 动态测试:...
- Mockito等库用于模拟依赖,使测试更加独立。 这份20页的文档很可能会涵盖这些主题,帮助开发者识别和解决问题。每个主题都包含丰富的细节,值得深入学习和实践。通过不断学习和积累经验,Java开发者可以更有效地...
3.JUnit与Mockito:单元测试工具,JUnit用于编写测试用例,Mockito用于模拟对象行为。 以上只是Java面试中可能涉及的一部分知识点,实际面试中还会根据具体职位和技术栈深入探讨。准备Java面试时,不仅要掌握这些...
12. **单元测试与Mockito**:学习如何编写单元测试来验证代码逻辑,以及使用Mockito框架对依赖进行模拟,以提高代码质量。 13. **热修复与插件化**:对于大型项目,了解如何实现热修复(如Facebook的FLEX、阿里巴巴...