无法在SpringJUnit4ClassRunner测试用例中设置SecurityManager

时间:2019-06-25 10:36:49

标签: java spring junit

我想在Spring测试用例中测试System.exit,并想使用SecurityManager来捕获出口并引发异常。

测试用例定义如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyTest{
    @Test
    public void mytestcase() {
        System.setSecurityManager(new MySecurityManager());   //This line is problematic

.....
    }

MySecurityManager的定义如下

public class MySecurityManager extends SecurityManager {
    @Override
    public void checkExit(final int status) {
        throw new ExitSecurityException();
    }

    @Override
    public void checkPermission(final Permission perm) {
    }

    public static final class ExitSecurityException extends SecurityException {
        ....
    }
}

但是,如果出现此行,我总是会出现异常

System.setSecurityManager(new MySecurityManager());

就位。尽管我的测试不会通过,但如果将此行注释掉也可以运行。

我得到的例外是:

java.lang.IllegalStateException: The ApplicationContext loaded for [[MergedContextConfiguration@4c60d6e9 testClass = MyTest, locations = '{}', classes = '{class com.mycompany.MyTest$TestConfig}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@7c469c48, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@6d2a209c, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]] is not active. Ensure that the context has not been closed programmatically.

    at org.springframework.util.Assert.state(Assert.java:392)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:87)
    at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.afterTestMethod(ResetMocksTestExecutionListener.java:50)
    at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:319)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:94)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

有人可以帮我理解吗?

0 个答案:

没有答案
相关问题