当前位置: 首页 > 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 就可以解决这个问题。



http://www.lryc.cn/news/500068.html

相关文章:

  • vue3字典数据的显示问题(使用hooks解决)
  • Elasticsearch 单节点安全配置与用户认证
  • 二分查找(带图详解)
  • 【Git】:标签管理
  • 物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉
  • 单片机软件工程师前景分析
  • 在Java中几种常用数据压缩算法的实现及其优劣势
  • Word——如何打出 符号中的 1、2、3等带圆圈的序号
  • 操作系统之进程与线程
  • 代码随想录算法训练营打卡第35天:背包问题
  • 【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
  • vscode(一)安装(ubuntu20.04)
  • 利用永恒之蓝对win7进行键盘记录
  • 万字长文解读深度学习——dVAE(DALL·E的核心部件)
  • RL仿真库pybullet
  • file_get_contents函数导致网站卡死响应超时
  • 如何使用C#与SQL Server数据库进行交互
  • #渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(上)
  • vue3 项目搭建-9-通过 router 在跳转页面时传参
  • Java、python标识符命名规范
  • 高效职场人
  • 深入探索现代 IT 技术:从云计算到人工智能的全面解析
  • 【AI学习】苹果技术报告《Apple Intelligence Foundation Language Models》
  • 深度相机获取实时图像总结
  • Nginx限流实践-limit_req和limit_conn的使用说明
  • Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?
  • 记一次由docker容器使得服务器cpu占满密码和密钥无法访问bug
  • 前端TS基础
  • 前端面经每日一题day06
  • SOC,SOH含义区别及计算公式