在 IntelliJ IDEA 中使用 JUnit 进行单元测试

1. 介绍 JUnit

JUnit 是 Java 语言中最流行的单元测试框架之一。它基于 xUnit 设计模式,支持 测试自动化、断言(Assertions)和测试生命周期管理,是 Java 开发中进行 TDD(测试驱动开发) 的重要工具。

JUnit 主要特点:

  • 轻量级:不需要复杂的配置即可使用。
  • 自动化测试:支持 @Test 注解实现测试自动化。
  • 测试报告:与 Maven、Gradle 和 CI/CD 集成,生成测试报告。
  • 参数化测试:支持 @ParameterizedTest 进行数据驱动测试。
  • 兼容性:JUnit 5 兼容 JUnit 4/3,并提供 Vintage 组件用于向后兼容。

2. 安装 JUnit(Maven 项目)

pom.xml 中添加 JUnit 5 依赖(推荐使用 junit-jupiter 聚合依赖):

<properties><junit.version>5.9.2</junit.version>
</properties><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>${junit.version}</version><scope>test</scope></dependency>
</dependencies>

完整版本的 pom.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>MyTestJava</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><junit.version>5.9.2</junit.version>  <!-- 定义 JUnit 版本变量 --></properties><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies></project>

然后刷新 Maven 依赖:

mvn clean install

也可以通过下面的方式刷新依赖:

刷新依赖


3. 编写 JUnit 测试代码

创建 APITest.java 并添加以下代码:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class APITest {int add(int a, int b) {return a + b;}@Testvoid testAddition() {assertEquals(5, add(2, 3));assertEquals(-1, add(-2, 1));}
}

解释:

  • @Test:标记为 JUnit 测试方法。
  • assertEquals(expected, actual):断言 expectedactual 结果是否相等。

4. 运行 JUnit 测试

方法 1:使用 IntelliJ IDEA 运行

  1. 右键 APITest.java,选择 Run 'APITest'
  2. 测试窗口 查看测试结果。

输出测试结果

方法 2:使用 Maven 运行

在 IDEA 的 Terminal 运行:

mvn test

方法 3:在 CI/CD(如 GitHub Actions)中运行

- name: Run Testsrun: mvn test

5. JUnit 进阶功能

5.1 断言(Assertions)

JUnit 提供多种断言方式:

@Test
void testAssertions() {assertTrue(3 > 2, "3 应该大于 2");assertFalse(2 > 3, "2 不应该大于 3");assertNull(null);assertNotNull("Hello");assertThrows(ArithmeticException.class, () -> { int x = 1 / 0; });
}

5.2 测试生命周期(Setup & Teardown)

JUnit 5 提供 @BeforeEach@AfterEach 进行 测试前后初始化和清理

import org.junit.jupiter.api.*;class TestLifecycle {@BeforeEachvoid setUp() {System.out.println("测试开始");}@Testvoid testSomething() {System.out.println("执行测试");}@AfterEachvoid tearDown() {System.out.println("测试结束");}
}

5.3 参数化测试

使用 @ParameterizedTest 进行 数据驱动测试

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;class ParameterizedExample {@ParameterizedTest@ValueSource(strings = {"JUnit", "TestNG", "Mockito"})void testWithParameters(String framework) {assertNotNull(framework);}
}

6. 解决 JUnit 运行时报错问题

问题 1:ClassNotFoundException: org.junit.jupiter.api

原因:JUnit 依赖未正确解析。
解决方案

  • 检查 pom.xml,确保 junit-jupiter 依赖存在。
  • 刷新 Maven 依赖(右键 pom.xmlReload Project)。

问题 2:TestEngine with ID ‘junit-jupiter’ failed to discover tests

原因:缺少 junit-jupiter-engine
解决方案

  • 直接使用 junit-jupiter 聚合依赖,避免单独引入 junit-jupiter-api

问题 3:Maven 运行 mvn test 时报错

解决方案

mvn clean test -U  # 强制更新依赖

7. 总结

步骤操作
安装 JUnitpom.xml 添加 junit-jupiter 依赖
编写测试代码使用 @Test 方法进行断言
运行测试IDEA 运行,或 mvn test
高级功能断言、生命周期、参数化测试

使用 JUnit 5 + IntelliJ IDEA,可以轻松进行 Java 单元测试,提高代码质量,并支持自动化测试!

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

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

相关文章

单片机的发展

一、引言 单片机自诞生以来&#xff0c;经历了四十多年的风风雨雨&#xff0c;从最初的工业控制逐步扩展到家电、通信、智能家居等各个领域。其发展过程就像是一场精彩的冒险&#xff0c;每一次技术的革新都像是在未知的海域中开辟新的航线。 二、单片机的发展历程 &#xff…

常见的博弈模型有哪些

常见的博弈模型有哪些 目录 常见的博弈模型有哪些**1. 重复博弈(Repeated Game)****2. 进化博弈论(Evolutionary Game Theory)****3. 机制设计(Mechanism Design)****4. 微分博弈(Differential Game)****5. 贝叶斯博弈(Bayesian Game)****6. 合作博弈(Cooperative G…

【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型

一、数据类型分类 二、数值类型 1.bit类型 测试环境ubuntu 基本语法&#xff1a; bit[(M)]&#xff1a;位字段类型&#xff0c;M表示每个值的位数&#xff0c;范围从1&#xff5e;64&#xff1b;如果M被忽略&#xff0c;默认为1举例&#xff1a; create table testBit(id i…

golang从入门到做牛马:第一篇-我与golang的缘分,go语言简介

还记得2018年的夏天,刚毕业的我不知道该做些什么,于是自学了一周的go语言,想要找一份go语言工作的代码,当时的go还没有go mod来管理依赖包,在北京找了一个月的工作,找到了一个小公司做了后端开发,当然使用go语言开发,带着兴奋劲,年轻身体也好,边努力学习,边工作。 时…

【数据库】MySQL常见聚合查询详解

在数据库操作中&#xff0c;聚合查询是非常重要的一部分。通过聚合查询&#xff0c;我们可以对数据进行汇总、统计和分析。MySQL提供了丰富的聚合函数来满足不同的需求。本文将详细介绍MySQL中常见的40个聚合函数及其使用场景&#xff0c;并通过8个的案例展示它们的用法。 一、…

调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)

文章目录 调研&#xff1a;如何实现智能分析助手&#xff08;Agent&#xff09;&#xff08;AutoCoder、FastGPT、AutoGen、DataCopilot&#xff09;一、交互流程二、数据流程三、架构分类四、开源产品4.1 AutoCoder&#xff08;知识库变体&#xff09;4.2 FastGPT&#xff08;…

【Vue CLI脚手架开发】——6.scoped样式

文章目录 一、scoped是什么二、应用案例1.使用代码2.原理3父组件App未添加scoped影响 一、scoped是什么 我们知道vue为了防止css样式污染&#xff0c;在每个组件中提供了 scoped属性进行限定css作用域&#xff1b;当<style>标签有 scoped 属性时&#xff0c;它的 CSS 只…

高精算法的用法及其优势

高精度问题是指当数据的位数非常大&#xff08;超出标准数据类型的范围&#xff09;时&#xff0c;如何进行计算和存储的问题。常见场景包括大整数的加、减、乘、除、取模等操作。以下是解决高精度问题的常用方法与技巧&#xff1a; 一、数据存储 数组存储 用整型数组存储&am…

VM+CentOS虚拟机

关于VMCentOS虚拟机的配置和使用&#xff0c;可以参考以下博客中的详细教程&#xff1a; **一、VMCentOS虚拟机配置** 1. **虚拟机网络配置** - 在VMware中&#xff0c;点击“编辑”→“虚拟网络编辑器”&#xff0c;选择VMnet8并进行相关设置。 - 子网IP可以改成如192.168.1…

设置 CursorRules 规则

为什么要设置CursorRules&#xff1f; 设置 CursorRules 可以帮助优化代码生成和开发流程&#xff0c;提升工作效率。具体的好处包括&#xff1a; 1、自动化代码生成 &#xff1a;通过定义规则&#xff0c;Cursor 可以根据你的开发需求自动生成符合规定的代码模板&#xff0c…

pip install速度太慢的多种解决方案

目录 问题描述为什么 pip 速度这么慢&#xff1f;解决方案1. 使用国内镜像源2. 配置多个镜像源3. 使用第三方工具4. 手动下载后本地安装5. 优化网络环境6. 更新 pip 版本 测试效果 问题描述 在使用 Python 进行开发时&#xff0c;我们经常需要使用 pip 来安装第三方库。然而&am…

Java阻塞队列深度解析:高并发场景下的安全卫士

一、阻塞队列的核心价值 在电商秒杀系统中&#xff0c;瞬时涌入的10万请求如果直接冲击数据库&#xff0c;必然导致系统崩溃。阻塞队列如同一个智能缓冲带&#xff0c;通过流量削峰和异步解耦两大核心能力&#xff0c;成为高并发系统的核心组件。 二、Java阻塞队列实现类对比 …

基于RapidOCR与DeepSeek的智能表格转换技术实践

基于RapidOCR与DeepSeek的智能表格转换技术实践 一、技术背景与需求场景 在金融分析、数据报表处理等领域&#xff0c;存在大量图片格式的表格数据需要结构化处理。本文介绍基于开源RapidOCR表格识别与DeepSeek大模型的智能转换方案&#xff0c;实现以下典型场景&#xff1a; …

django中视图作用和视图功能 以及用法

在 Django REST Framework(DRF)中,视图(View)是处理 HTTP 请求并返回响应的核心组件。DRF 提供了多种视图类,适用于不同的场景和需求。以下是 DRF 中常见的视图类及其作用、使用方法的详细说明: 一、DRF 视图的分类 DRF 的视图可以分为以下几类: 基于函数的视图(Func…

希音(Shein)前端开发面试题集锦和参考答案

用 Node 写过什么工具或 npm 包 在实际开发中,使用 Node 编写过多种实用工具和 npm 包。 自动化构建工具 开发了一个简单的自动化构建工具,用于处理前端项目的资源压缩和合并。在前端项目中,为了优化性能,需要对 CSS 和 JavaScript 文件进行压缩,减少文件体积,同时将多个…

C语言100天练习题【记录本】

C语言经典100题&#xff08;手把手 编程&#xff09; 可以在哔哩哔哩找到 已解决的天数&#xff1a;一&#xff0c;二&#xff0c;五&#xff0c;六 下面的都是模模糊糊的 可以学学这些算法&#xff0c;我是算法白痴&#xff0c;但是我不是白痴&#xff0c;可以学&#xff…

迷你世界脚本文字板接口:Graphics

文字板接口&#xff1a;Graphics 彼得兔 更新时间: 2024-08-27 11:12:18 具体函数名及描述如下: 序号 函数名 函数描述 1 makeGraphicsText(...) 创建文字板信息 2 makeflotageText(...) 创建漂浮文字信息 3 makeGraphicsProgress(...) 创建进度条信息…

Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取

Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取 在当今人工智能时代&#xff0c;网络爬虫扮演着至关重要的角色。它们不仅是数据收集的强大工具&#xff0c;更是驱动机器学习、自然语言处理等技术发展的关键引擎。 然而&#xff0c;对于用户来说&#xff0c;在面对复杂多…

下载b站视频音频

文章目录 方案一&#xff1a;jjdown如何使用 方案二&#xff1a;bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频&#xff1a;复制音频下载地址 方案三&#xff1a;bat命令下载单个音频下载单个视频下载单个音视频 方案一&#xff1a;jjdo…

【Git】linux搭建Gitea配置mysql数据库

WindowsServer搭建内网Gitea【中文更方便使用】 1. 安装Gitea # 下载 wget https://dl.gitea.io/gitea/1.23.5/gitea-1.23.5-linux-amd642. 创建用户 # 创建 gitea 用户 sudo adduser --system --shell /bin/bash --comment Git Version Control --create-home --home-dir /…