【发布时间】:2017-12-14 13:27:24
【问题描述】:
当我运行这个测试时(使用 jmockit 和 TestNG,不确定这是否相关):
public class Test {
@Test public void test(@Mocked ProcessBuilder pb) throws IOException {
new Expectations() {{ pb.start(); result = null; }};
assertNull(m());
}
public static Process m() throws IOException {
return new ProcessBuilder("").start();
}
}
我得到了这个例外:
java.lang.IllegalAccessError: class java.lang.ProcessBuilder (in module java.base) cannot access class javax.print.PrintException (in module java.desktop) because module java.base does not read module java.desktop
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java)
....
我正在使用 build 177。
我可以使用 --add-reads java.base=java.desktop 参数重新运行测试,它工作正常,但我不太明白这里发生了什么。
为什么会出现这个异常?
【问题讨论】:
-
我的猜测是与隐式加载的类的一些交互;
PrintException确实扩展了IOException,当使用与 Swing 不明显相关的东西时,这感觉就像莫名其妙的HeadlessExceptions。我建议提交一个关于可能的隐藏类依赖的错误。 -
类/jar 是在模块路径还是类路径上?是否为您的代码定义了任何模块?
-
@MichaelEaster 在类路径上 - 我没有定义任何模块。这是一个简单的项目,带有一个 pom.xml,它依赖于 TestNG 和 jmockit 以及一个文件(问题中的 Test 类)。该 pom 包含一个
-Djdk.attach.allowAttachSelf的 argLine 以确保允许 jmockit 运行。
标签: java jmockit java-9 java-platform-module-system