讲师中心 微信公众号
AI工具推荐 视频效率加速

Java 模块化系统中怎么编写跨模块的集成测试

夏强大大_5973

夏强大大_5973

发布时间:2026-09-09 18:28:06

|

198人浏览过

|

来源于php中文网

原创

Java模块化集成测试需声明测试模块依赖、用Testcontainers启动真实服务、统一模块路径运行、通过ServiceLoader验证服务契约。

java 模块化系统中怎么编写跨模块的集成测试

Java 模块化系统(即 Java Platform Module System,JPMS)中编写跨模块的集成测试,核心难点在于模块封装性限制了类的可见性、服务发现和资源访问。直接用传统方式写测试容易遇到 IllegalAccessError、Module not found、class not visible to module 等问题。关键不是“能不能测”,而是“怎么让测试代码合法地穿透模块边界,同时保持真实集成行为”。

以下是从实践出发的四个关键方向:

明确测试模块的声明与依赖

测试代码本身需要作为独立模块(如 `cim.integration.test`),并在 `module-info.java` 中显式声明对被测模块的 `requires`,以及必要的 `opens` 或 `exports`: ```java // src/test/java/module-info.java module cim.integration.test { requires cim.server; requires cim.route; requires cim.client; requires org.junit.jupiter; requires org.testcontainers;
// 允许测试反射访问被测模块的包(必要时)
opens com.cim.server.integration to org.junit.jupiter;
opens com.cim.route.config to org.junit.jupiter;

}

javascript-pro
javascript-pro

专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

下载
⚠️ 注意:`opens` 是运行时允许反射访问的关键;`exports` 仅在需被其他模块主动调用时才用(测试模块通常不需要导出)。

<H3>用 Testcontainers 启动真实依赖服务</H3>
跨模块集成常涉及多进程协作(如 `cim-server` + `cim-route` + ZooKeeper)。不能靠 `@SpringBootTest` 单模块启动模拟——必须还原真实部署拓扑:
- 为每个被测模块准备对应的 Docker 容器(ZooKeeper、Redis、PostgreSQL 等)
- 使用 `@Container` 声明静态容器实例(Testcontainers 推荐用 `@Testcontainers` 类级注解)
- 在 `@BeforeAll` 中等待所有容器就绪,并注入配置(如 `cim.route` 读取 `zookeeper.connect=cim-zk:2181`)

示例:
```java
@Testcontainers
class MultiModuleIntegrationTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")
        .withDatabaseName("cim_test");

    @Container
    static ZooKeeperContainer zookeeper = new ZooKeeperContainer("zookeeper:3.9.2");

    @Test
    void whenClientSendsMessage_thenServerAndRouteProcessIt() {
        // 启动 cim-server(通过 Maven exec 或嵌入式方式)
        // 启动 cim-route(连接 zookeeper)
        // 启动 cim-client(连接 route)
        // 执行端到端消息流转断言
    }
}

避免在测试中绕过模块系统

不要用 `-p`(--module-path)配合 `-cp`(--class-path)混用方式强行加载类——这会破坏模块图一致性,导致 `ServiceLoader` 失效或 `ServiceConfigurationError`。正确做法是: - 测试模块和被测模块统一放在 `--module-path` 下 - 使用 `java --module cim.integration.test/cim.integration.test.MainTest` 方式运行 - 构建时用 Maven 的 `maven-compiler-plugin` 和 `maven-surefire-plugin` 显式配置模块参数: ```xml org.apache.maven.pluginsmaven-surefire-plugin--module-path ${project.build.outputDirectory}/modules --add-modules ALL-SYSTEM,cim.integration.test ```

服务接口层做契约驱动测试

跨模块交互往往通过 `module-info.java` 中的 `uses` / `provides` 声明服务。集成测试应验证服务契约是否真正履行: - 被测模块 `cim.route` 声明 `provides RouteService with ZooKeeperRouteServiceImpl` - 测试模块 `requires cim.route` 并 `uses RouteService` - 在测试中通过 `ServiceLoader.load(RouteService.class)` 获取实例,再调用其方法断言行为

这样既尊重 JPMS 设计,又覆盖了模块间服务发现的真实路径,比直接 new 实现类更贴近生产环境。

立即学习“Java免费学习笔记(深入)”;

不复杂但容易忽略。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

9877

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

7002

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

6192

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1064

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

888

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1296

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2589

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

19911

2023.08.03

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn