当我运行此测试时(使用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
参数重新运行测试,但它运行正常,但我不太了解这里发生了什么。
为什么我会收到该例外?
答案 0 :(得分:8)
IllegalAccessError提示JMockit已经在java.desktop模块中引用了异常的ProcessBuilder(在java.base中)。我不知道它为什么选择这个例外,这可能是JMockit邮件列表的内容。但它确实解释了--add-reads
解决问题的原因。
答案 1 :(得分:2)
已为JMockit 1.34确定issue。
在启动期间,JMockit会修改JRE类(添加几个字段),以便为JRE类的模拟提供支持。被修改的实际类是任意的,并且javax.print.PrintException
被用作(作为次要选择),因为它通常永远不会在典型的测试运行中加载。在JDK 9上,无法从" base"模块,所以它现在被另一个替换。