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

标签 java junit gradle

我正在尝试使用安全管理器来阻止开发人员在单元测试中写入和读取文件。为此,我们考虑使用自定义安全管理器类。所以我们创建了一个自定义安全管理器并在 checkRead 和 checkWrite 方法中抛出异常。

因此,当我使用 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中插入一个自定义的Security Manager来进行单元测试呢?

最佳答案

你找到了一些东西......经过大量挖掘,我得到了以下在 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 标志运行也很有帮助:

  • 例如gradle 测试 -i

关于java - 使用 Gradle 运行 JUnit 时设置自定义安全管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584997/

相关文章:

java如何通过任何帐户发送电子邮件

java - 如何快速更改ORM数据库中的多条记录?

java - 运行 junit 作为服务器并注入(inject)更改?

java - 为什么 Jenkins 无法加载资源?

java - 用唯一的数字表示一组字符串,也可以根据数字进行排序。

java - 如何从未排序的 x/y 坐标数组中查找直线

java - Spring Batch - 在 Eclipse 中作为应用程序运行 - SQLException 无效的模式名称 - JUnit

Android 在 travis.ci 上构建变体

Android Studio 0.8.6 更改默认构建变体

android - Androidmanifest.xml文件中的gradle构建错误