`
bbwang8088
  • 浏览: 45995 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mockito学习记录

 
阅读更多

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 Cookbook》,开发者能够掌握如何利用Mockito提升单元测试的质量,减少因为依赖问题导致的测试复杂性,从而提高代码的可靠性和整体项目的质量。结合TDD实践,Mockito成为了一种强大的工具,...

    Mockito入门

    在学习Mockito的过程中,阅读官方文档和实践案例是至关重要的。通过不断地练习,你会掌握如何有效地使用Mockito来编写整洁、易于维护的单元测试。参考博文链接中的内容,可以找到更多关于Mockito的实际应用和示例。

    mockito源码 供java同学学习,用于在自动化单元测试中创建测试对象,为TDD或BDD提供支持

    同时,Mockito还会记录下调用这些模拟方法的参数和调用顺序,从而可以校验出这个Mock对象是否被正确地按期望的顺序和参数进行了调用。这在某些情况下尤其重要,比如当我们需要确认某个方法是否被调用,以及它的参数...

    Spring Boot 学习笔记完整教程.pdf

    10. Spring Boot集成测试:学习如何进行集成测试,包括使用JUnit和Mockito等工具。 11. Spring Boot热部署:了解热部署的原理,以及如何在Spring Boot中启用热部署来加速开发过程。 12. Spring Boot监控和管理:...

    Packt Publishing Mockito Essentials (2014)

    ### Mockito Essentials知识点详解 #### 一、探索测试双重(Test Doubles) ...以上内容涵盖了《Mockito Essentials》书中涉及的关键知识点和技术细节,为读者提供了深入学习Mockito框架的基础和指南。

    Java_Mockito初学者教程.zip

    通过学习这个Java Mockito初学者教程,你可以掌握如何编写整洁、可维护的单元测试,这对于提升代码质量和团队协作效率至关重要。同时,理解并熟练运用Mockito可以让你在面试或项目中展现出专业的能力。记住,练习是...

    良葛格JAVA 学习笔记

    《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...

    基于Java的网课学习笔记设计源码

    这个系统的设计目标是为用户创造一个便捷、高效的在线学习环境,帮助他们更好地整理、记录和管理自己的学习笔记。以下是项目中涉及的一些核心知识点: 1. **Java编程基础**:作为项目的开发语言,Java提供了面向...

    java校招学习笔记

    "java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...

    spring学习笔记(3.20)

    【标题】"spring学习笔记(3.20)" 暗示了这是一份关于Spring框架的教程或学习记录,重点可能聚焦在特定版本3.20的特性、使用方法或者最佳实践上。Spring是一个广泛使用的Java企业级应用开发框架,它提供了依赖注入...

    Java后端学习笔记代码Java后端学习笔记代码

    本压缩包"Java后端学习笔记代码"显然是一个针对Java后端开发的学习资源集合,包含了作者在学习过程中编写的代码示例和笔记。以下是基于这个主题的详细知识点解析: 1. **Java基础**: 作为Java后端开发的起点,掌握...

    spring编程学习笔记

    本学习笔记将深入探讨Spring的主要模块和关键概念。 一、Spring核心模块 1. **IoC容器**:Spring的核心组件,负责管理对象的生命周期和对象之间的依赖关系。通过XML配置文件或注解实现依赖注入,降低了代码的耦合...

    Java很好的学习笔记部署环境

    这篇“Java很好的学习笔记部署环境”提供了丰富的资源,旨在帮助初学者和有经验的开发者深入理解如何配置和管理Java开发和运行环境。以下将详细介绍其中涉及的关键知识点。 1. **JDK安装与配置**:Java开发工具包...

    springboot学习思维笔记.rar

    - "content.json"、"manifest.json"、"metadata.json"这些文件可能是笔记的元数据或内容索引,用于记录笔记的结构和信息。 - "content.xml"可能包含具体的笔记内容,按照XML格式组织。 - "Thumbnails"文件夹可能...

    spring2.0学习笔记

    本学习笔记旨在深入探讨Spring 2.0的核心特性,帮助开发者更好地理解和运用这个强大的框架。 1. **依赖注入(Dependency Injection, DI)**:Spring 2.0加强了DI,允许开发者通过XML配置或注解来管理对象间的依赖...

    JavaEE学习笔记

    JavaEE学习笔记是Java开发领域中的重要资源,它包含了丰富的技术知识和实践经验,旨在帮助初学者和有经验的开发者深入理解Java企业级应用的开发。JavaEE(Java Platform, Enterprise Edition)是Oracle公司主导的...

    android 学习笔记doc

    这篇学习笔记涵盖了Android开发的基本知识点,旨在帮助初学者系统地理解和深入探索这个平台。 1. **Android系统架构**:Android由Linux内核、硬件抽象层(HAL)、运行库层、应用程序框架层和应用程序层组成。了解...

    Android study notes 安卓学习笔记

    13. **Android测试**:学习JUnit、Espresso(UI测试)、Robolectric(模拟器测试)和Mockito(单元测试),确保代码质量。 14. **Gradle构建系统**:掌握Gradle脚本和插件,理解依赖管理和构建过程,能自定义构建...

    Android_学习笔记.zip

    在Android学习过程中,笔记是积累知识的重要方式。这个"Android_学习笔记.zip"文件很可能包含了一个详细的Android开发学习路径和关键知识点的总结。下面将基于这个主题,详细讲解Android开发的一些核心概念和技术。 ...

Global site tag (gtag.js) - Google Analytics