如何在Java16模块化多包项目中免逐个配置JVM参数运行JUnit4测试套件?
在Java 16模块化项目中简化JUnit4测试套件的
--add-opens配置 核心问题原因
Java模块化系统默认限制未命名模块(JUnit4运行在此模块中)通过反射访问命名模块的非导出包。JUnit4的测试套件需要反射加载各个子包中的测试类、执行测试方法,所以会触发权限限制,这就是你需要给每个测试子包加--add-opens的原因。
最优解决方案:通配符一次性开放整个测试包树
不用逐个添加子包的--add-opens参数,Java 9及以上支持包树通配符,可以一次性开放mve.test下的所有子包(包括嵌套子包)给未命名模块:
--add-opens mve/mve.test..=ALL-UNNAMED
这里的两个点..表示匹配mve.test包及其所有层级的子包,这样一条参数就能覆盖你所有测试子包的反射访问需求,不用再为每个子包单独配置。
针对你的MVE验证
用这条参数替换原来多个子包的配置后,运行测试套件时,JUnit4就能正常加载mve.test.sub下的HelloTest,无需额外配置。
备选方案(若允许调整模块结构)
如果你愿意调整模块结构,可以把测试代码单独放到一个mve.test模块中,在该模块的module-info.java里显式开放测试包给JUnit4:
module mve.test { opens mve.test to org.junit.runner; opens mve.test.sub to org.junit.runner; // 或者用通配符开放所有子包 opens mve.test.. to org.junit.runner; requires mve; requires junit; }
不过这会改变你当前“未导出任何内容”的状态,适合可以调整模块结构的场景。
内容的提问来源于stack exchange,提问作者Arend
相关产品推荐
相关产品推荐

