我正在尝试使用安全管理器来防止开发人员在单元测试中编写和读取文件。为此,我们考虑使用自定义Security Manager类。因此,我们创建了一个自定义的安全管理器,并在checkRead和checkWrite方法中抛出异常。
当我使用Java编译器从Intellij运行测试时,它可以正常运行。作为示例,我使用了以下BeforeClass方法:
但是当我尝试运行这个程序时,出现了以下错误:
那么,有没有办法在Gradle单元测试中插入自定义的安全管理器呢?
当我使用Java编译器从Intellij运行测试时,它可以正常运行。作为示例,我使用了以下BeforeClass方法:
@BeforeClass
public static void printSecurityManager() throws Exception {
System.setSecurityManager(new BuildSecurityManager());
}
但是当我使用 gradle clean test
运行这个测试时,Gradle 测试就会一直卡住没有响应。
于是,我尝试在 build.gradle 中安装安全管理器,方式如下(只是为了看看能否在此处插入安全管理器):
test {
logger.warn("running tests from gradle")
SecurityManager manager = System.getSecurityManager();
if (manager == null) {
println("there is no security manager!");
}
jvmArgs "-Djava.security.manager=java.lang.SecurityManager"
但是当我尝试运行这个程序时,出现了以下错误:
:test
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ClassLoader.checkClassLoaderPermission(ClassLoader.java:1525)
at java.lang.ClassLoader.getParent(ClassLoader.java:1371)
at jarjar.org.gradle.process.internal.launcher.GradleWorkerMain.run(GradleWorkerMain.java:66)
at jarjar.org.gradle.process.internal.launcher.GradleWorkerMain.main(GradleWorkerMain.java:74)
:test FAILED
那么,有没有办法在Gradle单元测试中插入自定义的安全管理器呢?