Java 使用Gradle运行JUnit时设置自定义安全管理器

Java 使用Gradle运行JUnit时设置自定义安全管理器,java,junit,gradle,Java,Junit,Gradle,我试图使用安全管理器来阻止开发人员在单元测试中编写和读取文件。为了做到这一点,我们考虑使用一个定制的安全管理器类。因此,我们创建了一个自定义安全管理器,并在checkRead和checkWrite方法中抛出异常 因此,当我使用java编译器从Intellij运行测试时,它运行良好 例如,我使用以下BeforeClass方法: @BeforeClass public static void printSecurityManager() throws Exception {

我试图使用安全管理器来阻止开发人员在单元测试中编写和读取文件。为了做到这一点,我们考虑使用一个定制的安全管理器类。因此,我们创建了一个自定义安全管理器,并在checkRead和checkWrite方法中抛出异常

因此,当我使用java编译器从Intellij运行测试时,它运行良好

例如,我使用以下BeforeClass方法:

    @BeforeClass
    public static void printSecurityManager() throws Exception {

        System.setSecurityManager(new BuildSecurityManager());

    }
但是当我使用
gradleclean测试运行这个测试时,gradle测试只是挂起,没有响应

然后,我尝试以以下方式使用build.gradle安装安全管理器(只是想看看是否可以在此处插入安全管理器):

但是,当我尝试运行此程序时,出现以下错误:

: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中插入一个定制的安全管理器来进行单元测试呢

由于我的一位同事,我找到了第二个问题的原因。AccessControlException的原因是java.lang提供的默认SecurityManager不允许应用程序获取类加载器。gradle安装安全管理器后,它仍然尝试获取类加载器,因此出现错误

因此,解决方案是要么必须使用SecurityManager提供安全策略文件,要么必须提供SecurityManager的自定义实现


我还没有找到解决挂起问题的办法

你发现了什么。。。经过大量挖掘,我在JUnit测试类中获得了以下内容:

public class SomeTest {
    private static final SecurityManager SM = System.getSecurityManager();

    @BeforeClass
    public static void startup() throws Exception {

        System.setSecurityManager(new SecurityManager() {
            @Override
            public void checkPermission(Permission perm) {
            }

            @Override
            public void checkPermission(Permission perm, Object context) {
            }

            @Override
            public void checkExit(int status) {
                String message = "System exit requested with error " + status;
                throw new SecurityException(message);
            }
        });
    }

    @AfterClass
    public static void shutdown(){
        System.setSecurityManager(SM);
    }

    @Test(expected=SecurityException.class)
    public void someTestThatSystemExits()
    {
        System.exit(1);
    }
}
背景链接:

使用-i和-d标志运行也很有帮助:

  • e、 g.
    gradle测试-i
public class SomeTest {
    private static final SecurityManager SM = System.getSecurityManager();

    @BeforeClass
    public static void startup() throws Exception {

        System.setSecurityManager(new SecurityManager() {
            @Override
            public void checkPermission(Permission perm) {
            }

            @Override
            public void checkPermission(Permission perm, Object context) {
            }

            @Override
            public void checkExit(int status) {
                String message = "System exit requested with error " + status;
                throw new SecurityException(message);
            }
        });
    }

    @AfterClass
    public static void shutdown(){
        System.setSecurityManager(SM);
    }

    @Test(expected=SecurityException.class)
    public void someTestThatSystemExits()
    {
        System.exit(1);
    }
}