Maven的单元测试

server/2025/2/6 13:17:58/

1. 单元测试的基本概念

单元测试(Unit Testing) 是一种软件测试方法,专注于测试程序中的最小可测试单元——通常是单个类或方法。通过单元测试,可以确保每个模块按预期工作,从而提高代码的质量和可靠性。

2.安装和配置 JUnit 5

使用 Maven 配置 JUnit 5

首先,在项目的 pom.xml 文件中添加 JUnit 5 的依赖项。

java"><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>com.example.myproject</groupId><artifactId>my-application</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>My Application</name><description>A sample application using Maven and JUnit 5</description><dependencies><!-- 添加 JUnit 5 依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build>
</project>

3.编写单元测试

示例项目结构

假设我们有一个简单的数学工具类 MathUtils,我们将为其编写单元测试

java">my-maven-project/
├── pom.xml
├── src/
│   ├── main/
│   │   └── java/
│   │       └── com/example/myproject/
│   │           └── MathUtils.java
│   └── test/
│       └── java/
│           └── com/example/myproject/
│               └── MathUtilsTest.java
创建 MathUtils 类

src/main/java/com/example/myproject/MathUtils.java

java">package com.example.myproject;public class MathUtils {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}public double divide(int a, int b) {if (b == 0) {throw new IllegalArgumentException("Cannot divide by zero");}return (double) a / b;}public int multiply(int a, int b) {return a * b;}
}

运行结果:

 

java">private MathUtils mathUtils;@BeforeEach
void setUp() {mathUtils = new MathUtils();
}
  • @BeforeEach 注解表示该方法在每个测试方法执行前都会被调用,用于初始化测试对象。

编写测试方法:

  • 测试加法

java">@Test
void testAdd() {assertEquals(5, mathUtils.add(2, 3), "2 + 3 should equal 5");
}
  • @Test 注解表示这是一个测试方法。
  • assertEquals(expected, actual, message) 断言期望值与实际值相等,并提供自定义消息。

测试减法:

java">@Test
void testSubtract() {assertEquals(-1, mathUtils.subtract(2, 3), "2 - 3 should equal -1");
}

测试除法:

java">@Test
void testDivide() {assertEquals(2.5, mathUtils.divide(5, 2), 0.001, "5 / 2 should equal 2.5");Exception exception = assertThrows(IllegalArgumentException.class, () -> {mathUtils.divide(1, 0);});assertEquals("Cannot divide by zero", exception.getMessage(), "Exception message should be 'Cannot divide by zero'");
}
  • assertThrows(exceptionType, executable) 断言抛出指定类型的异常。
  • assertEquals(expected, actual, delta, message) 用于比较浮点数时允许一定的误差范围。

高级特性

参数化测试

JUnit 5 支持参数化测试,允许你使用不同的输入数据多次运行同一个测试方法。

java">package com.example.myproject;import static org.junit.jupiter.params.provider.Arguments.arguments;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;import java.util.stream.Stream;class MathUtilsTest {private MathUtils mathUtils;@BeforeEachvoid setUp() {mathUtils = new MathUtils();}@ParameterizedTest(name = "{index} => add({0}, {1}) = {2}")@MethodSource("addProvider")void testAdd(int a, int b, int expected) {assertEquals(expected, mathUtils.add(a, b));}private static Stream<Arguments> addProvider() {return Stream.of(arguments(2, 3, 5),arguments(-1, 1, 0),arguments(0, 0, 0));}
}
动态测试

JUnit 5 允许你在运行时动态生成测试用例。

java">package com.example.myproject;import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.DynamicNode;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.function.Executable;import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;import static org.junit.jupiter.api.DynamicTest.dynamicTest;class MathUtilsTest {private MathUtils mathUtils;@BeforeEachvoid setUp() {mathUtils = new MathUtils();}@TestFactoryStream<DynamicNode> dynamicTestsFromStream() {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);return numbers.stream().map(number ->dynamicTest("multiply " + number + " by 2",() -> assertEquals(number * 2, mathUtils.multiply(number, 2))));}
}


http://www.ppmy.cn/server/165415.html

相关文章

Qt Creator 中使用 vcpkg

Qt Creator 中使用 vcpkg Qt Creator 是一个跨平台的轻量级 IDE&#xff0c;做 Qt 程序开发的同学们肯定对这个 IDE 都比较属于。这个 IDE 虽然没有 Visual Stdio 功能那么强&#xff0c;但是由于和 Qt 集成的比较深&#xff0c;用来开发 Qt 程序还是很顺手的。 早期&#xf…

Leetcode922: 按奇偶排序数组 II

题目描述&#xff1a; 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返…

【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…

数据结构:树和二叉树概念_堆篇

图均为博主手绘 , 代码基于vs2022实现 系列文章目录 数据结构:时间复杂度 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 栈和队列特别篇:栈和队列的经典算法问题 文章目录 系…

本地Ollama部署DeepSeek R1模型接入Word

目录 1.本地部署DeepSeek-R1模型 2.接入Word 3.效果演示 4.问题反馈 上一篇文章办公新利器&#xff1a;DeepSeekWord&#xff0c;让你的工作更高效-CSDN博客https://blog.csdn.net/qq_63708623/article/details/145418457?spm1001.2014.3001.5501https://blog.csdn.net/qq…

网络安全(黑客)——自学2025

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“…

幕墙工程项目管理新趋势:数字化软件解决方案

幕墙工程项目管理的新趋势正朝着数字化、智能化和高效协同的方向发展&#xff0c;益企工程云工程项目管理软件作为这一趋势的代表&#xff0c;展现出了显著的优势。以下是对幕墙工程项目管理新趋势及益企工程云工程项目管理软件的详细分析&#xff1a; 幕墙工程项目管理新趋势 …

高效 MyBatis SQL 写法一

高效 MyBatis SQL 写法一 前言 MyBatis 作为一款优秀的持久层框架&#xff0c;极大地简化了数据库操作。 然而&#xff0c;在实际开发中&#xff0c;XML 配置的编写仍然可能显得繁琐。 本文将分享一些 MyBatis 动态 SQL 的优质写法&#xff0c;帮助开发者提升效率并减少错误…