为何JUnit无需声明requires jdk.unsupported即可访问该模块?
JUnit与常规Java程序访问jdk.unsupported模块的行为差异解析
我想搞明白JUnit和常规Java程序在访问jdk.unsupported模块时的行为差异,我清楚不应使用该模块,只是想理解背后的运行机制。
常规Java程序的表现
我编写了如下程序:
public class UnsafeAttempt { public static void main(String[] args) { try { Class.forName("sun.reflect.ReflectionFactory"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }
在模块路径上运行时,该程序会抛出java.lang.ClassNotFoundException,这符合我的预期。当我在module-info.java中添加requires jdk.unsupported;后,程序便能正常运行,这也在预期之内。
JUnit测试的异常表现
但将这段逻辑放在单元测试中时:
import org.junit.jupiter.api.Test; public class UnsafeTest { @Test public void sunreflect() throws Exception { Class.forName("sun.reflect.ReflectionFactory"); } }
配合src/test/java下的这个module-info.java文件:
open module my.module { exports my.module; requires org.junit.jupiter.api; }
即使未添加requires jdk.unsupported;,测试仍能正常运行,我对此感到困惑。
该行为在IntelliJ和Maven中均会出现,且我未对Maven Surefire插件做任何配置。
想知道JUnit、Surefire或其他组件做了什么,才导致这种情况?
编辑:已创建GitHub仓库用于复现该问题,方便大家测试。
内容的提问来源于stack exchange,提问作者jqno
相关产品推荐
相关产品推荐

