Java 单元测试模拟框架-Mockito 的介绍

Mockito 是什么

在这里插入图片描述

Mockito 是一个用于单元测试的模拟框架,基于它可以使用简洁易用的API编写出色的测试。
Mockito 允许开发人员创建和管理模拟对象(mock objects),以便在测试过程中替换那些不容易构造或获取的对象。

Mockito的基本概念

  1. Mock对象:在调试期间用来作为真实对象的替代品。通过模拟对象,可以模拟外部依赖、交互行为等,从而使测试更加独立和可控。
  2. Mock测试:在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。
  3. Stub:存根,即为mock对象的方法指定返回值(可抛出异常)。
  4. Verify:行为验证,验证指定方法调用情况(是否被调用,调用次数等)。

Mockito的主要功能

  1. 模拟方法行为:Mockito允许对模拟对象的方法进行stubbing,即定义当调用某个方法时应该返回的值或抛出的异常。
  2. 验证交互行为:Mockito提供了丰富的API来验证模拟对象的交互行为,例如方法是否被调用、调用次数、参数匹配等。
  3. 参数匹配器:Mockito提供了参数匹配器,允许在验证方法调用时使用通配符或自定义匹配规则。
  4. 部分模拟:使用@Spy注解可以创建一个部分模拟对象,允许选择性地模拟对象中的某些方法。

选择Mockito作为模拟框架的原因

  • StackOverflow庞大的社区将Mockito评为Java的最佳模拟框架
  • 在2013年末对30,000个GitHub项目进行分析时,Mockito在所有库(不仅仅是测试工具)中位列前10名Java库。尽管Mockito在主报告中排名第九,但mockito-core和mockito-all是同一工具,因此Mockito的实际排名是第四,超过了诸如Guava或Spring等著名工具。将此研究视为Mockito每天对用Java编写的单元测试产生巨大影响的指标。
  • 行为驱动开发(BDD)的创始人Dan North在2008年写道:“我们在主要会议期间决定使用JUnit 4和Mockito,因为我们认为它们是Java中TDD和模拟的未来。”

基于Maven 如何使用Mockito:

Mockito的使用步骤

  1. 添加依赖:在项目的构建文件(如Maven的pom.xml或Gradle的build.gradle)中添加Mockito的依赖。
  2. 设置测试类:使用@RunWith(MockitoJUnitRunner.class)注解测试类,或使用MockitoAnnotations.initMocks(this)在@Before方法中初始化模拟对象。
  3. 创建模拟对象:使用@Mock注解创建模拟对象,或使用Mockito.mock(Class)方法。
  4. 设置模拟行为:使用when(…).thenReturn(…)或doReturn(…).when(…)等方法设置模拟对象的行为。
  5. 编写测试方法:在测试方法中调用被测对象的方法,并使用verify(…)等方法验证交互行为。
  6. 运行测试:使用JUnit运行测试,并查看测试结果。

Mockito当前的最新版本是 5.14.2,在pom.xml中导入之后就可以开始使用了。

<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>5.14.2</version>
</dependency>

使用场景1: 验证交互行为, 模拟方法是否被调用了?

创建Mock对象, 验证对象的方法是否被调用了。

/*** Copyright (C)  Oscar Chen(XM):* * Date: 2024-12-01* Author: XM*/
package com.osxm.test.mock;import static org.mockito.Mockito.*; // 导入Mockito的静态方法import java.util.List;import org.junit.jupiter.api.Test;public class MockitoTest {@Testpublic void mockitoDemo() {// 创建mock对象List mockedList = mock(List.class); // 创建一个List接口的mock对象// 或者在Mockito 4.10.0及以上版本中,使用更简洁的方式// List mockedList = mock();// 使用mock对象,它不会抛出任何“意外交互”异常mockedList.add("one");mockedList.clear();// 选择性、明确且高度可读的验证verify(mockedList).add("one"); // 验证mock对象调用了add方法并传入了"one"verify(mockedList).clear(); // 验证mock对象调用了clear方法}}

使用场景2:模拟方法调用

模拟方法执行返回的结果。

    @Testpublic void mockMethodCall(){// 不仅可以模拟接口,还可以模拟具体类LinkedList mockedList = mock(LinkedList.class); // 创建一个LinkedList类的mock对象// 或者在Mockito 4.10.0及以上版本中,使用更简洁的方式// LinkedList mockedList = mock();// 在实际执行之前进行模拟(stubbing)when(mockedList.get(0)).thenReturn("first"); // 当调用mockedList的get(0)方法时,返回"first"// 以下打印输出为"first"System.out.println(mockedList.get(0));// 以下打印输出为"null",因为get(999)方法没有被模拟System.out.println(mockedList.get(999));}

主要参考

  • mock()方法,或者 @Mock注解: 创建模拟对象
  • when()/given() 指定模拟对象的行为
  • spy()/@Spy 部门模拟, 真实方法会呼叫并且可以被验证和存根
  • @InjectMocks:自动注入用@Spy或@Mock注解的模拟/间谍字段
  • verify() : 检查方法是否使用给定参数被调用
    • 可以使用灵活的参数匹配,例如通过any()匹配任意表达式
    • 或者使用@Captor捕获被调用的参数
  • 可以使用BDDMockito进行行为驱动开发语法

Mockito的常用注解

  1. @RunWith:用于指定JUnit测试的运行器。对于Mockito,通常使用@RunWith(MockitoJUnitRunner.class)来运行测试。
  2. @Mock:用于创建模拟对象。
  3. @InjectMocks:用于将模拟对象注入到被测对象中。
  4. @Spy:用于创建部分模拟对象。

使用注意

不要干什么:

  • 不要模拟不属于你的类型
  • 不要模拟值对象
  • 不要模拟一切
  • 对测试表现一些爱心

不能干什么:

  1. 不能Mock静态方法:Mockito不支持对静态方法进行mock。
  2. 不能Mock private方法:Mockito不支持对private方法进行mock。
  3. 不能Mock final class:Mockito不支持对final类进行mock。

Mockito的集成与扩展

  1. 与JUnit集成:Mockito可以与JUnit无缝集成,使用@RunWith(MockitoJUnitRunner.class)即可。
  2. 与Spring集成:在Spring Boot项目中,可以使用@MockBean注解来模拟Spring上下文中的对象。
  3. 扩展功能:Mockito提供了丰富的扩展功能,如Mockito-inline用于支持内联Mocks的创建和使用等。

参考

  • 官方站点 http://site.mockito.org/#intro

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

websocket通信

“WebSocket 允许客户端和服务器在连接建立后随时互相发送数据&#xff0c;而无需每次交互都重新建立连接。”我想请问&#xff0c;第一次前端往后端发送数据时&#xff0c;传递的数据应该满足接口的参数内容&#xff0c;在第一次建立连接后之后的数据传递还是要满足接口的参数…

C++Qt开机自启动

文章目录 方法一&#xff1a;注册表方法二&#xff1a;快捷方式到自启动目录 方法一&#xff1a;注册表 #include <QtCore/QCoreApplication> #include <QtCore/QSettings> #include <QtCore/QDebug> #include <QtCore/QProcess>int main(int argc, c…

NiFi-从部署到开发(图文详解)

NiFi简介 Apache NiFi 是一款强大的开源数据集成工具&#xff0c;旨在简化数据流的管理、传输和自动化。它提供了直观的用户界面和可视化工具&#xff0c;使用户能够轻松设计、控制和监控复杂的数据流程&#xff0c;NiFi 具备强大的扩展性和可靠性&#xff0c;可用于处理海量数…

draggable插件——实现元素的拖动排序——拖动和不可拖动的两种情况处理

最近在写后台管理系统的时候&#xff0c;遇到一个需求&#xff0c;就是关于拖动排序的功能。 我之前是写过一个关于拖动表格的功能&#xff0c;此功能可以实现表格中的每一行数据上下拖动实现排序的效果。 vue——实现表格的拖拽排序功能——技能提升 但是目前我这边的需求是…

Delphi Web前端开发教程(9):基于TMS WEB Core框架

3、REST Servers服务端(后端)框架 REST服务端特点&#xff1a; – 为远程资源提供一个REST API接口。也可以为其他网络内容提供服务&#xff1b; – 包括在Delphi Enterprise & Architect企业版和架构师版中的RAD服务器、DataSnap、WebBroker&#xff1b; – 开源框架&a…

MySQL 函数创建中的 Err 1418:原因解析与解决指南20241203

&#x1f6a8; MySQL 函数创建中的 Err 1418&#xff1a;原因解析与解决指南 &#x1f4d6; 引言 在使用 MySQL 创建函数时&#xff0c;许多开发者会偶然遇到如下报错&#xff1a; [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its…

前端首屏加载优化

1.首屏加载慢的原因 网络延迟资源太大服务器响应慢 1.网络延迟 首屏优化中网络延迟是一个重要的考虑因素&#xff0c;它直接影响到页面资源的加载速度和用户体验。 影响原因 后端服务器性能原因&#xff0c;导致响应速度慢&#xff0c;从而影响了首屏加载速度。网络传输速度…

利用空闲主机进行Nmap隐匿扫描:IP伪造与空闲扫描技术

IP伪造与空闲扫描技术 在网络安全领域&#xff0c;扫描和识别目标主机的开放端口是攻击者获取目标信息的重要手段。传统的扫描方法可能会暴露扫描者的真实IP地址&#xff0c;从而引起目标主机的警觉。然而&#xff0c;IP地址伪造是一种巧妙的方式&#xff0c;可以帮助攻击者在…

学习视频超分辨率扩散模型中的空间适应和时间相干性(原文翻译)

文章目录 摘要1. Introduction2. Related Work3. Our Approach3.1. Video Upscaler3.2. Spatial Feature Adaptation Module3.3. Temporal Feature Alignment Module3.4. Video Refiner3.5. Training Strategy 4. Experiments4.1. Experimental Settings4.2. Comparisons with …

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…

SpringMVC其他扩展

一、全局异常处理机制: 1.异常处理两种方式: 开发过程中是不可避免地会出现各种异常情况的&#xff0c;例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题&#xff0c;甚至直接导致程序崩溃。因此&#xff0c;在开发过程中&#xff0c;…

AWS S3 权限配置与文件上传下载指南

本文介绍如何配置 AWS S3 存储桶的访问权限,实现 EC2 实例上传文件和本地用户下载文件的功能。 权限配置 © ivwdcwso (ID: u012172506) 1. EC2 角色上传权限 创建 IAM 角色并附加以下策略,允许 EC2 实例上传文件到 S3: {"Version": "2012-10-17&qu…

Flink随笔 20241203 Flink重点内容

Flink 是一个强大的流处理框架&#xff0c;它的设计理念是高吞吐量、低延迟的流式计算。你提到的这些重点是 Flink 的核心组成部分&#xff0c;下面我将详细解析每一个方面。 1. 窗口&#xff08;Window&#xff09; 窗口是 Flink 流处理中一个非常重要的概念&#xff0c;主要…

Linux-异步IO和存储映射IO

异步IO 在 I/O 多路复用中&#xff0c;进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作。而在异步 I/O 中&#xff0c;当文件描述符上可以执行 I/O 操作时&#xff0c;进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务…

docker更换容器存储位置

一&#xff1a;原因 今天之前在某个服务器上使用docker搭建的服务突然无法访问了&#xff0c;进入服务器查看发现服务运行正常&#xff0c;但是就是无法使用&#xff0c;然后我这边准备将docker服务重新启动下看看&#xff0c;发现docker服务无法重启&#xff0c;提示内存已满…

工业—使用Flink处理Kafka中的数据_ProduceRecord2

使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“

什么是TCP的三次握手

TCP&#xff08;传输控制协议&#xff09;的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据&#xff0c;并且初始化双方的序列号。以下是三次握手的详细步骤&#xff1a; 第一次握手&#xff08;SYN&#xff09;&…

外卖开发(二)开发笔记——DTO、自定义全局异常处理、ThreadLocal、日期格式化

外卖开发&#xff08;二&#xff09;开发笔记 一、DTO二、自定义全局异常处理三、ThreadLocal存入、提取当前登陆用户的id四、日期格式化1、实体类属性上加入注解JsonFormat2、在WebMvcConfiguration中扩展SpringMVC的消息转换器 一、DTO 数据传输对象&#xff08;DTO&#xf…

Java 中tableaw 实战教程

java中tableaw库通过简单的API实现过滤、连接、绘制和操作表格数据。支持CSV&#xff0c;数据库&#xff0c;Excel等数据源。 安装依赖 tableaw是用于分析表格数据的开源Java库&#xff0c;构建在Java 8流之上。它可以从GitHub下载&#xff0c;也可以作为Maven或Gradle项目的…

jvm-46-jvm Thread Dump 线程的信息获取+可视分析化工具 FastThread

拓展阅读 JVM FULL GC 生产问题 I-多线程通用实现 JVM FULL GC 生产问题 II-如何定位内存泄露&#xff1f; 线程通用实现 JVM FULL GC 生产问题 III-多线程执行队列的封装实现&#xff0c;进一步抽象 jvm-44-jvm 内存性能分析工具 Eclipse Memory Analyzer Tool (MAT) / 内…