junit 5 支持模块化代码需正确配置模块导出、依赖声明及构建工具模块路径:主模块须 exports 被测包,测试模块需 requires 主模块和 junit,并 opens 测试包;maven 中启用 usemodulepath。

JUnit 5 对模块化代码(即 Java 9+ 的 module-info.java 项目)的支持是开箱即用的,但需注意模块路径、依赖导出与测试类可见性等关键细节。只要配置得当,测试本身和非模块化项目几乎一致,只是编译和运行阶段多了模块系统约束。
确保模块声明正确导出测试所需包
被测代码若位于命名模块中,必须显式导出(`exports`)给测试模块使用,否则测试类无法访问其 public 类型:-
若你的主模块是
com.example.calculator,且Calculator类在com.example.calculator包中:// src/main/java/module-info.java module com.example.calculator { exports com.example.calculator; // ✅ 必须导出,否则测试类看不到该包 } -
测试模块默认不自动读取主模块(即使同名),因此还需在测试模块声明中
requires主模块:
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// src/test/java/module-info.java module com.example.calculator.test { requires com.example.calculator; // ✅ 显式依赖主模块 requires org.junit.jupiter.api; requires org.junit.jupiter.engine; opens com.example.calculator.test to org.junit.jupiter.engine; // ✅ 允许反射调用测试方法 }
构建工具需启用模块路径而非类路径
Maven 默认使用类路径(classpath),而模块化项目必须用模块路径(module path)。需配置 `maven-compiler-plugin` 和 `maven-surefire-plugin` 支持模块:- Maven 配置示例(pom.xml):
<build><plugins><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>3.13.0</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding><compilerargs><arg>--enable-preview</arg></compilerargs></configuration></plugin><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-surefire-plugin</artifactid><version>3.2.5</version><configuration><usemodulepath>true</usemodulepath><!-- ✅ 关键:启用模块路径 --></configuration></plugin></plugins></build>
测试类写法与普通 JUnit 5 完全一致
模块化不影响测试逻辑,只需保证测试类能被加载、被反射调用,且可访问被测类型:-
示例测试类(
src/test/java/com/example/calculator/test/CalculatorTest.java):package com.example.calculator.test; import com.example.calculator.Calculator; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class CalculatorTest { @Test void testAdd() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3)); } } -
注意点:
- 测试类所在包无需
exports(测试模块自身不对外提供 API) -
opens模块语句已确保 JUnit 引擎可通过反射执行测试方法 - 不需要
@Test方法为public(JUnit 5 支持包级私有方法)
- 测试类所在包无需
常见问题与绕过技巧
- **IDE 报“cannot resolve symbol”**:Eclipse/IntelliJ 可能未识别模块结构。在 IntelliJ 中右键项目 → *Reload project*;Eclipse 需启用 *Java 9+ Module Support* 并刷新构建路径。 - **测试类找不到主模块类**:检查 `module-info.java` 是否漏写 `requires` 或 `exports`,或 `maven-surefire-plugin` 未启用 `useModulePath`。 - **想跳过模块系统快速验证?**:临时移除 `module-info.java`,改用传统 classpath 运行测试(仅用于调试,不推荐长期绕过模块化)。不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










