如何设置java安全策略文件,以便在通过gradle执行JUnit测试时仅避免System.exit调用?

如何设置java安全策略文件,以便在通过gradle执行JUnit测试时仅避免System.exit调用?,java,gradle,junit,java-security,java-security-manager,Java,Gradle,Junit,Java Security,Java Security Manager,我希望通过gradle执行JUnit测试,避免在这些测试中调用System.exit()。我读过,设置一个安全策略文件就可以了 这是我正在使用的安全策略文件 grant { permission java.io.RuntimePermission "exitVM", "none"; }; 我正在gradle构建文件中设置seecurity.policy和security manager属性,如下所示: systemProperty 'java.s

我希望通过gradle执行JUnit测试,避免在这些测试中调用System.exit()。我读过,设置一个安全策略文件就可以了

这是我正在使用的安全策略文件

grant {
    permission java.io.RuntimePermission "exitVM", "none";
};
我正在gradle构建文件中设置seecurity.policy和security manager属性,如下所示:

systemProperty 'java.security.policy', file(project.ext.projectHome + "/security.policy").absolutePath
jvmArgs "-Djava.security.manager"
但当我运行测试时,测试任务失败,堆栈跟踪如下:

uccessfully started process 'Gradle Test Executor 20'
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
Caused by: java.lang.ExceptionInInitializerError
        at mockit.internal.state.TestRun.<init>(TestRun.java:43)
        at mockit.internal.state.TestRun.<clinit>(TestRun.java:22)
        at mockit.internal.faking.FakeMethods.registerFakeStates(FakeMethods.java:210)
        at mockit.internal.faking.FakeClassSetup.registerFakeClassAndItsStates(FakeClassSetup.java:57)
        at mockit.internal.faking.FakeClassSetup.<init>(FakeClassSetup.java:48)
        at mockit.internal.faking.FakeClassSetup.<init>(FakeClassSetup.java:35)
        at mockit.MockUp.redefineClass(MockUp.java:122)
        at mockit.MockUp.<init>(MockUp.java:80)
        at mockit.integration.junit4.FakeRunNotifier.<init>(FakeRunNotifier.java:24)
        at mockit.internal.startup.JMockitInitialization.applyInternalStartupFakesAsNeeded(JMockitInitialization.java:37)
        at mockit.internal.startup.JMockitInitialization.initialize(JMockitInitialization.java:26)
        at mockit.internal.startup.Startup.applyStartupFakes(Startup.java:58)
        at mockit.internal.startup.Startup.initialize(Startup.java:50)
        at mockit.internal.startup.Startup.premain(Startup.java:44)
        ... 6 more
Caused by: java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")
        at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
        at java.base/java.security.AccessController.checkPermission(AccessController.java:897)
        at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
        at java.base/java.lang.reflect.AccessibleObject.checkPermission(AccessibleObject.java:83)
        at java.base/java.lang.reflect.Method.setAccessible(Method.java:191)
        at mockit.internal.faking.FakeClasses.<clinit>(FakeClasses.java:21)
FATAL ERROR in native method: processing of -javaagent failed
        ... 20 more
已成功启动进程“梯度测试执行器20”
线程“main”java.lang.reflect.InvocationTargetException中出现异常
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:566)
位于java.instrument/sun.instrumentation.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
位于java.instrument/sun.instrumentation.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
原因:java.lang.ExceptionInInitializeError
位于mockit.internal.state.TestRun.(TestRun.java:43)
位于mockit.internal.state.TestRun.(TestRun.java:22)
在mockit.internal.faking.FakeMethods.registerFakeStates(FakeMethods.java:210)中
在mockit.internal.faking.FakeClassSetup.RegisterFakeClassAnditsState(FakeClassSetup.java:57)
在mockit.internal.faking.FakeClassSetup。(FakeClassSetup.java:48)
在mockit.internal.faking.FakeClassSetup。(FakeClassSetup.java:35)
在mockit.MockUp.redefineClass(MockUp.java:122)
在mockit.MockUp。(MockUp.java:80)
位于mockit.integration.junit4.FakeRunNotifier。(FakeRunNotifier.java:24)
在mockit.internal.startup.JMockitInitialization.applyInternalStartupFakesAsNeeded(JMockitInitialization.java:37)
在mockit.internal.startup.JMockitInitialization.initialize(JMockitInitialization.java:26)中
在mockit.internal.startup.startup.applyStartupFakes(startup.java:58)
在mockit.internal.startup.startup.initialize(startup.java:50)中
在mockit.internal.startup.startup.premain(startup.java:44)
... 还有6个
原因:java.security.AccessControlException:拒绝访问(“java.lang.reflect.ReflectPermission”“suppressAccessChecks”)
位于java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
位于java.base/java.security.AccessController.checkPermission(AccessController.java:897)
位于java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
位于java.base/java.lang.reflect.AccessibleObject.checkPermission(AccessibleObject.java:83)
位于java.base/java.lang.reflect.Method.setAccessible(Method.java:191)
在mockit.internal.faking.FakeClasses。(FakeClasses.java:21)
本机方法中出现致命错误:处理-javaagent失败
... 20多
看起来安全管理器正在阻止对JMockit等代理的其他权限。 我需要像往常一样将所有其他权限应用于代码库,但System.exit()调用除外


我该怎么做?我遗漏了什么吗?

(代码没有维护;它可能会正常工作)尝试将
java.io.RuntimePermission
替换为
java.lang.RuntimePermission
。但是我认为
permission java.lang.RuntimePermission“exitVM”、“none”
等于
权限java.lang.RuntimePermission“exitVM.*”和允许以任何状态退出,因为RuntimePermission上的操作(无)被忽略。