我正在尝试使用安全管理器来阻止开发人员在单元测试中写入和读取文件。为此,我们考虑使用自定义安全管理器类。所以我们创建了一个自定义安全管理器并在 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);
}
}
背景链接:
- https://discuss.gradle.org/t/gradle-build-process-hangs-when-system-setsecuritymanager-new-securitymanager-is-called/11670
- https://issues.gradle.org/browse/GRADLE-2170
- http://gradle.1045684.n5.nabble.com/Infinite-wait-running-tests-td5561210.html
- https://discuss.gradle.org/t/java-lang-internalerror-could-not-create-securitymanager-jarjar-org-gradle-process-internal-child-bootstrapsecuritymanager/2478
- https://issues.gradle.org/browse/GRADLE-2759
- http://docs.oracle.com/javase/7/docs/api/java/lang/SecurityManager.html
使用 -i 和 -d 标志运行也很有帮助:
- 例如
gradle 测试 -i
关于java - 使用 Gradle 运行 JUnit 时设置自定义安全管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584997/