mockito学习记录
1 配置 Mock 对象
List mock = mock( List.class ); when( mock.get(0) ).thenReturn( 1 ); assertEquals( "预期返回1", 1, mock.get( 0 ) );// mock.get(0) 返回 1
我们看到 List 为 Java.util.List 是接口,并不是实现类,但这不妨碍我们使用它作为我们的“打桩”对象,——当然你也可以使用实现类,传入 mock(obj) 方法中。这里提到的是"打桩(Stub,也有人称其为“存根”)"的概念,是一个形象的说法,就是把所需的测试数据塞进对象中,适用于基于状态的(state-based)测试,关注的是输入和输出。Mockito 中 when(…).thenReturn(…) 这样的语法来定义对象方法和参数(输入),然后在 thenReturn 中指定结果(输出)。此过程称为 Stub 打桩。一旦这个方法被 stub 了,就会一直返回这个 stub 的值。
注意以下几点:
对于 static 和 final 方法, Mockito 无法对其 when(…).thenReturn(…) 操作。
当我们连续两次为同一个方法使用 stub 的时候,他只会只用最新的一次。
2 打桩支持迭代风格的返回值设定,例如
// 第一种方式 when(i.next()).thenReturn("Hello").thenReturn("World"); // 第二种方式 when(i.next()).thenReturn("Hello", "World"); // 第三种方式,都是等价的 when(i.next()).thenReturn("Hello"); when(i.next()).thenReturn("World");
第一次调用 i.next() 将返回 ”Hello”,第二次的调用会返回 ”World”。
3 返回值为void的方法
Nothing().when(obj).notify(); // 或直接 when(obj).notify();
4 强行抛出异常
when(i.next()).thenThrow(new RuntimeException()); doThrow(new RuntimeException()).when(i).remove(); // void 方法的 // 迭代风格 doNothing().doThrow(new RuntimeException()).when(i).remove(); // 第一次调用 remove 方法什么都不做,第二次调用抛出 RuntimeException 异常。
5 模拟传入的参数 argument matchers
提供 argument matchers 机制,例如 anyString() 匹配任何 String 参数,anyInt() 匹配任何 int 参数,anySet() 匹配任何 Set,any() 则意味着参数为任意值。例子如下,
when(mockedList.get(anyInt())).thenReturn("element"); System.out.println(mockedList.get(999));// 此时打印是 element
再进一步,自定义类型也可以,如 any(User.class)
6 Answer接口-获取随机返回的结果
final Map<String, Object> hash = new HashMap<String, Object>(); Answer<String> aswser = new Answer<String>() { public String answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); return hash.get(args[0].toString()).toString(); } }; when(request.getAttribute("isRawOutput")).thenReturn(true); when(request.getAttribute("errMsg")).thenAnswer(aswser); when(request.getAttribute("msg")).thenAnswer(aswser);
7 验证 Verify
前面提到的 when(……).thenReturn(……) 属于状态测试,某些时候,测试不关心返回结果,而是侧重方法有否被正确的参数调用过,这时候就应该使用 验证方法了。从概念上讲,就是和状态测试所不同的“行为测试”了。
一旦使用 mock() 对模拟对象打桩,意味着 Mockito 会记录着这个模拟对象调用了什么方法,还有调用了多少次。最后由用户决定是否需要进行验证,即 verify() 方法。
Map mock = Mockito.mock( Map.class ); when( mock.get( "city" ) ).thenReturn( "广州" ); // 关注参数有否传入 verify(mock).get( Matchers.eq( "city" ) ); // 关注调用的次数 verify(mock, times( 2 ));
Mockito 除了提供 times(N) 方法供我们调用外,还提供了很多可选的方法:
never() 没有被调用,相当于 times(0)
atLeast(N) 至少被调用 N 次
atLeastOnce() 相当于 atLeast(1)
atMost(N) 最多被调用 N 次
相关推荐
通过深入学习《Mockito Cookbook》,开发者能够掌握如何利用Mockito提升单元测试的质量,减少因为依赖问题导致的测试复杂性,从而提高代码的可靠性和整体项目的质量。结合TDD实践,Mockito成为了一种强大的工具,...
在学习Mockito的过程中,阅读官方文档和实践案例是至关重要的。通过不断地练习,你会掌握如何有效地使用Mockito来编写整洁、易于维护的单元测试。参考博文链接中的内容,可以找到更多关于Mockito的实际应用和示例。
同时,Mockito还会记录下调用这些模拟方法的参数和调用顺序,从而可以校验出这个Mock对象是否被正确地按期望的顺序和参数进行了调用。这在某些情况下尤其重要,比如当我们需要确认某个方法是否被调用,以及它的参数...
10. Spring Boot集成测试:学习如何进行集成测试,包括使用JUnit和Mockito等工具。 11. Spring Boot热部署:了解热部署的原理,以及如何在Spring Boot中启用热部署来加速开发过程。 12. Spring Boot监控和管理:...
### Mockito Essentials知识点详解 #### 一、探索测试双重(Test Doubles) ...以上内容涵盖了《Mockito Essentials》书中涉及的关键知识点和技术细节,为读者提供了深入学习Mockito框架的基础和指南。
通过学习这个Java Mockito初学者教程,你可以掌握如何编写整洁、可维护的单元测试,这对于提升代码质量和团队协作效率至关重要。同时,理解并熟练运用Mockito可以让你在面试或项目中展现出专业的能力。记住,练习是...
《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...
这个系统的设计目标是为用户创造一个便捷、高效的在线学习环境,帮助他们更好地整理、记录和管理自己的学习笔记。以下是项目中涉及的一些核心知识点: 1. **Java编程基础**:作为项目的开发语言,Java提供了面向...
"java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...
【标题】"spring学习笔记(3.20)" 暗示了这是一份关于Spring框架的教程或学习记录,重点可能聚焦在特定版本3.20的特性、使用方法或者最佳实践上。Spring是一个广泛使用的Java企业级应用开发框架,它提供了依赖注入...
本压缩包"Java后端学习笔记代码"显然是一个针对Java后端开发的学习资源集合,包含了作者在学习过程中编写的代码示例和笔记。以下是基于这个主题的详细知识点解析: 1. **Java基础**: 作为Java后端开发的起点,掌握...
本学习笔记将深入探讨Spring的主要模块和关键概念。 一、Spring核心模块 1. **IoC容器**:Spring的核心组件,负责管理对象的生命周期和对象之间的依赖关系。通过XML配置文件或注解实现依赖注入,降低了代码的耦合...
这篇“Java很好的学习笔记部署环境”提供了丰富的资源,旨在帮助初学者和有经验的开发者深入理解如何配置和管理Java开发和运行环境。以下将详细介绍其中涉及的关键知识点。 1. **JDK安装与配置**:Java开发工具包...
- "content.json"、"manifest.json"、"metadata.json"这些文件可能是笔记的元数据或内容索引,用于记录笔记的结构和信息。 - "content.xml"可能包含具体的笔记内容,按照XML格式组织。 - "Thumbnails"文件夹可能...
本学习笔记旨在深入探讨Spring 2.0的核心特性,帮助开发者更好地理解和运用这个强大的框架。 1. **依赖注入(Dependency Injection, DI)**:Spring 2.0加强了DI,允许开发者通过XML配置或注解来管理对象间的依赖...
JavaEE学习笔记是Java开发领域中的重要资源,它包含了丰富的技术知识和实践经验,旨在帮助初学者和有经验的开发者深入理解Java企业级应用的开发。JavaEE(Java Platform, Enterprise Edition)是Oracle公司主导的...
这篇学习笔记涵盖了Android开发的基本知识点,旨在帮助初学者系统地理解和深入探索这个平台。 1. **Android系统架构**:Android由Linux内核、硬件抽象层(HAL)、运行库层、应用程序框架层和应用程序层组成。了解...
13. **Android测试**:学习JUnit、Espresso(UI测试)、Robolectric(模拟器测试)和Mockito(单元测试),确保代码质量。 14. **Gradle构建系统**:掌握Gradle脚本和插件,理解依赖管理和构建过程,能自定义构建...
在Android学习过程中,笔记是积累知识的重要方式。这个"Android_学习笔记.zip"文件很可能包含了一个详细的Android开发学习路径和关键知识点的总结。下面将基于这个主题,详细讲解Android开发的一些核心概念和技术。 ...