当前位置: 首页 > news >正文

透彻理解并解决Mockito模拟框架的单元测试无法运行的问题

本篇的实例基于Maven

IDE (VS Code) 运行

在VS Code 运行的时候, 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮,单击就可以运行使用Mockito 注解 @ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。
在这里插入图片描述

  • 不使用注解:
*** Copyright (C)  Oscar Chen(XM):* * Date: 2024-12-07* Author: XM*/
package com.osxm.test.mock;import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.jupiter.api.Test;public class MockMethodTest {@Testpublic void objectMock() {List<String> mockedList = mock(List.class); // 创建一个List接口的mock对象when(mockedList.get(0)).thenReturn("first");mockedList.get(0);verify(mockedList).get(0); }
}
  • 使用注解
//*** Copyright (C)  Oscar Chen(XM):* * Date: 2024-12-01* Author: XM*/
package com.osxm.test.mock;import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;import java.util.List;import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;@ExtendWith(MockitoExtension.class)
public class MockitoUsageTest {@Mockprivate List<String> mockedList;@Testpublic void objectMock() {when(mockedList.get(0)).thenReturn("first");mockedList.get(0);verify(mockedList).get(0); }
}

如果需要调试模式可以右键单击按钮,在弹出菜单选择Debug Test
在这里插入图片描述

mvn test 命令行运行的问题

但是在命令行使用 mvn test 命令运行的时候, 却出现了比较奇怪的现象:

  • 普通的JUnit 测试类和方法能正常运行
  • 使用Mockito 的测试类能找到,但是测试方法找不到,如下图所示:

在这里插入图片描述

为什么呢? 这里首先要介绍一下 Maven的插件 maven-surefire-plugin。

maven-surefire-plugin

maven-surefire-plugin是Maven的一个插件,主要用于执行Java应用程序中的单元测试。

主要功能包括:

  1. 执行单元测试:maven-surefire-plugin可以自动发现并执行项目中的测试类。它默认使用JUnit来执行测试,但也可以配置为支持其他测试框架,如TestNG。
  2. 报告生成:该插件提供详细的测试结果报告,包括测试用例的数量、成功/失败/忽略的数量等,这些报告通常以纯文本(.txt)和XML(.xml)格式生成,并保存在项目的target/surefire-reports目录下。
  3. 定制测试执行:maven-surefire-plugin允许用户通过配置来定制测试的执行方式,例如指定特定的测试类或方法进行执行,或者排除某些测试类或方法。

mvn test 运行Mockito 测试的解法

在pom.xml 中添加maven-surefire-plugin 插件:

    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.5.2</version></plugin></plugins></build>

再次运行就可以找到Mockito 编写的测试类了。

在这里插入图片描述

问题

那么,问题来了:

  1. 为什么VS Code不添加maven-surefire-plugin可以运行单元测试?
  2. 为什么在不添加maven-surefire-plugin的状况下,普通的单元测试可以找到并运行,Mockito 的不行了呢?
    接下来就解惑这两个问题

### 为什么VS Code不添加maven-surefire-plugin可以运行单元测试?

在IDE中导入Maven项目时,IDE通常会自动读取pom.xml文件,并根据其中的配置来设置项目的构建和测试环境。如果pom.xml中没有显式配置maven-surefire-plugin,IDE可能会使用Maven的默认行为来执行测试。
另外, IDE通常还提供了测试运行器功能,允许用户直接运行和调试测试类。这些测试运行器可以与Maven的测试框架集成,从而在不依赖maven-surefire-plugin的情况下执行测试。

所以,对于IDE ,可以不依赖pom.xml 的maven-surefire-plugin 就可以运行测试

为什么在不添加maven-surefire-plugin的状况下,普通的单元测试可以找到并运行,Mockito 的不行了呢?

稍微细心一点就可以看到在显式添加maven-surefire-plugin 的前后的差异:
在这里插入图片描述

在pom.xml 显式添加maven-surefire-plugin 之前,使用mvn test 命令其实也使用了maven-surefire-plugin,只是版本比较低 ,是2.12.4 版。
这个原意就是 Maven内置了一个版本的maven-surefire-plugin,即使项目没有配置,也可以使用这个版本来运行单元测试,但是这里的状况,这个版本相对于Mockito 的版本来说,低了, 所以找不到Mockito 的测试。通过添加新版本的
maven-surefire-plugin 就可以解决这个问题。



相关文章:

透彻理解并解决Mockito模拟框架的单元测试无法运行的问题

本篇的实例基于Maven IDE (VS Code) 运行 在VS Code 运行的时候&#xff0c; 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮&#xff0c;单击就可以运行使用Mockito 注解 ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。 不使用注…...

vue3字典数据的显示问题(使用hooks解决)

我们在使用 element-plus的时候&#xff0c;经常会使用一些字典数据&#xff0c; 在搜索框的时候&#xff0c;字典数数要使用 el-select el-option 来显示&#xff0c;当在table表格的时候&#xff0c;我们通常记录的是 字典数据的id , 又要把它改变成 字典数据的 name 属性 因…...

Elasticsearch 单节点安全配置与用户认证

Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞&#xff1a;Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时&#xff0c;需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤&#xff0c;为单节…...

二分查找(带图详解)

优选算法系列 文章目录 优选算法系列前言一、二分查找的思想二、算法使用小总结 三、代码实现四、二分查找拓展4.1、查找第一次出现的target小总结 4.2、target最后出现的位置小总结 五、代码总结 前言 在这篇博客中&#xff0c;我会给大家分享二分查找及其扩展。 这是链接-&…...

【Git】:标签管理

目录 理解标签 创建标签 操作标签 理解标签 标签的作用 标记版本&#xff1a;标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。例如&#xff0c;在项目发布某个版本的时候&#xff0c;针对最后⼀次 commit 起⼀个 v1.0 这样…...

物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉

0. 要实现的效果 让树莓派可以识别身边的一些物品&#xff0c;比如电脑&#xff0c;鼠标&#xff0c;键盘&#xff0c;杯子&#xff0c;行李箱&#xff0c;双肩包&#xff0c;床&#xff0c;椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…...

单片机软件工程师前景分析

单片机软件工程师的前景在2024年看起来是积极的。随着物联网&#xff08;IoT&#xff09;、自动化、智能设备等领域的快速发展&#xff0c;对于能够开发基于单片机&#xff08;MCU&#xff09;如STM32、ARM、51等嵌入式系统的软件工程师需求持续增长。这些工程师负责设计和实现…...

在Java中几种常用数据压缩算法的实现及其优劣势

在Java中几种常用数据压缩算法的实现及其优劣势 背景&#xff1a;项目需要引入Redis作为缓存组件&#xff0c;需要考虑到Redis的内存占用&#xff08;机器内存越大&#xff0c;成本越高&#xff09;&#xff0c;因此需要引入数据压缩。 1、介绍 数据压缩是计算机领域中一项重要…...

Word——如何打出 符号中的 1、2、3等带圆圈的序号

一、方式1 1.1&#xff1a;点击 插入-符号 1.2&#xff1a;字体 选择 Wingdings 或者 Wingdings 2 二、方式2 带1的圈&#xff1a;输入 2460&#xff0c;然后按 AItX 带2的圈&#xff1a;输入 2461&#xff0c;然后按 AItX 带3的圈&#xff1a;输入 2462&#xff0c;然后按 …...

操作系统之进程与线程

进程 定义&#xff1a; 进程是具有独立功能的程序关于某个数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的独立单位。 组成&#xff1a; 包括程序代码、程序处理的数据、程序计数器、一组寄存器的值以及系统资源&#xff08;如打开的文件&#xff09;等。 …...

代码随想录算法训练营打卡第35天:背包问题

前言 zaccheo打卡代码随想录第35天 由于这段时间工作太忙了&#xff08;加上我的懒病犯了&#xff09;导致迟打卡了好几天555555.。。。 今天的主要是动态规划中的背包问题&#xff0c;这个真的是蛮难理解的&#xff0c;我把我自己强行按在椅子上半个小时一点一点的看卡哥文章…...

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…...

vscode(一)安装(ubuntu20.04)

1、更新软件包列表 sudo apt update2、安装依赖包 sudo apt install software-properties-common apt-transport-https wget3、导入Microsoft GPG密钥 wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -4、向系统添加VSCode存储库 sudo…...

利用永恒之蓝对win7进行键盘记录

打开kali中的msfconsole 找到永恒之蓝&#xff0c;设置靶机ip&#xff0c;后可以exploit&#xff0c;也可以run 连接成功 查看进程&#xff0c;选择监听靶机win7上的cmd.exe进程 当前进程不是1484&#xff0c;需要迁移到1484 cmd.exe&#xff0c;进程迁移 键盘监听&#xff0c;…...

万字长文解读深度学习——dVAE(DALL·E的核心部件)

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总 万字长…...

RL仿真库pybullet

1. 介绍 PyBullet是一个基于Bullet Physics引擎的物理仿真Python接口&#xff0c;主要用于机器人仿真模拟。 1.1 主要特点 提供大量预设的机器人模型&#xff0c;例如URDF(统一机器人描述格式)、SDF、MJCF 格式。适用于训练和评估强化学习算法&#xff0c;提供了大量的强化学…...

file_get_contents函数导致网站卡死响应超时

宝塔控制面板系统下运行包含file_get_contents函数的php文件时候&#xff0c;发生以下报错&#xff1a; PHP Warning: file_get_contents():php_network_getaddresses: getaddrinfo failed: 解决方法&#xff1a; 一&#xff1a;需要检查请求的远程主机是否在本机的/etc/host…...

如何使用C#与SQL Server数据库进行交互

一.创建数据库 用VS 创建数据库的步骤&#xff1a; 1.打开vs&#xff0c;创建一个新项目&#xff0c;分别在搜素框中选择C#、Windows、桌面&#xff0c;然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”&#xff0c;右键单击“数据连接”&#xff0…...

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(上)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

vue3 项目搭建-9-通过 router 在跳转页面时传参

第一步&#xff0c;在跳转链接处挂载方法&#xff0c;将要传输的数据传入&#xff1a; <a href"#" click.prevent"goToArticle(obj.id)" class"click"><h1>{{obj.title}}</h1><p>作者&#xff1a;{{obj.author}}</p&…...

如何用AI驱动的智能字幕工具解决日语视频字幕制作难题?零基础也能实现90%准确率的字幕生成方案

如何用AI驱动的智能字幕工具解决日语视频字幕制作难题&#xff1f;零基础也能实现90%准确率的字幕生成方案 【免费下载链接】N46Whisper Whisper based Japanese subtitle generator 项目地址: https://gitcode.com/gh_mirrors/n4/N46Whisper 日语视频字幕制作常常让内容…...

OpenClaw+GLM-4.7-Flash智能邮件分类:自动识别优先级与回复草稿

OpenClawGLM-4.7-Flash智能邮件分类&#xff1a;自动识别优先级与回复草稿 1. 为什么我需要智能邮件助手 每天早晨打开邮箱时&#xff0c;我的收件箱总是堆满未读邮件——客户咨询、会议邀请、系统通知、订阅推送混杂在一起。手动分类需要花费20-30分钟&#xff0c;而最让我头…...

突破格式壁垒:AnythingLLM的全类型文档解析方案

突破格式壁垒&#xff1a;AnythingLLM的全类型文档解析方案 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08;LLM&#…...

高效转换:Markdown与思维导图的无缝衔接指南

1. 为什么需要Markdown与思维导图的相互转换&#xff1f; 第一次接触Markdown和思维导图时&#xff0c;我就被它们的简洁高效所吸引。Markdown用简单的语法就能写出结构清晰的文档&#xff0c;而思维导图则能直观展示复杂的逻辑关系。但真正让我头疼的是&#xff0c;这两种工具…...

如何用G-Helper智能恢复ROG笔记本色彩显示:终极解决方案

如何用G-Helper智能恢复ROG笔记本色彩显示&#xff1a;终极解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地…...

SD2.0时钟与时序:从基础模式到高速传输的实战解析

1. SD2.0时钟与时序基础入门 第一次接触SD2.0规范时&#xff0c;我也被那些密密麻麻的时序参数搞得头晕眼花。直到在项目里实际调试SD卡读写失败的问题后&#xff0c;才发现理解时钟和时序的配合有多重要。简单来说&#xff0c;时钟就像两个人对话的节奏&#xff0c;而时序则是…...

HsMod炉石传说增强插件:从入门到精通的全方位指南

HsMod炉石传说增强插件&#xff1a;从入门到精通的全方位指南 【免费下载链接】HsMod Hearthstone Modify Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 价值定位&#xff1a;为什么HsMod能重新定义你的炉石体验&#xff1f; 在快节奏的现…...

如何通过OpCore-Simplify在30分钟内完成黑苹果EFI自动化配置

如何通过OpCore-Simplify在30分钟内完成黑苹果EFI自动化配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是一款专注于自动化OpenC…...

从一次“意外”发现flag说起:复盘uWSGI目录穿越漏洞(CVE-2018-7490)排查中的常见思维盲区

从"Not Found"到flag&#xff1a;uWSGI目录穿越漏洞实战思维全解析 当浏览器返回"Not Found"时&#xff0c;大多数人的第一反应是漏洞利用失败。但真正的安全测试往往始于这些看似失败的瞬间。去年在内部红队演练中&#xff0c;我遇到一个经典场景&#x…...

用AirScript脚本自动发送生日祝福邮件(极简版)

1. 为什么需要自动发送生日祝福邮件&#xff1f; 你有没有遇到过这样的情况&#xff1f;明明记得朋友的生日快到了&#xff0c;结果当天忙得团团转&#xff0c;等想起来的时候已经过了零点。或者更尴尬的是&#xff0c;设置了手机提醒&#xff0c;但看到通知后想着"等会儿…...