微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java:如何测试调用 System.exit() 的方法?

如何解决Java:如何测试调用 System.exit() 的方法?

事实上,Derkeiler.com建议:

  • 为什么System.exit()

与其以 System.exit(whateverValue) 终止,不如抛出一个未经检查的异常?在正常使用中,它会一直漂移到 JVM 的最后一搏捕手并关闭您的脚本(除非您决定在途中的某个地方捕获它,这可能在某天有用)。

在 JUnit 场景中,它将被 JUnit 框架捕获,该框架将报告某某测试失败并顺利进行下一个测试。

尝试修改 TestCase 以使用阻止调用 System.exit 的安全管理器运行,然后捕获 SecurityException。

public class NoExitTestCase extends TestCase 
{

    protected static class ExitException extends SecurityException 
    {
        public final int status;
        public ExitException(int status) 
        {
            super("There is no escape!");
            this.status = status;
        }
    }

    private static class NoExitSecurityManager extends SecurityManager 
    {
        @Override
        public void checkPermission(Permission perm) 
        {
            // allow anything.
        }
        @Override
        public void checkPermission(Permission perm, Object context) 
        {
            // allow anything.
        }
        @Override
        public void checkExit(int status) 
        {
            super.checkExit(status);
            throw new ExitException(status);
        }
    }

    @Override
    protected void setUp() throws Exception 
    {
        super.setUp();
        System.setSecurityManager(new NoExitSecurityManager());
    }

    @Override
    protected void tearDown() throws Exception 
    {
        System.setSecurityManager(null); // or save and restore original
        super.tearDown();
    }

    public void testNoExit() throws Exception 
    {
        System.out.println("Printing works");
    }

    public void testExit() throws Exception 
    {
        try 
        {
            System.exit(42);
        } catch (ExitException e) 
        {
            assertEquals("Exit status", 42, e.status);
        }
    }
}

2012 年 12 月更新: 在评论中建议使用](http://stefanbirkner.github.com/system-rules/) ,这是一组用于测试代码的 JUnit(4.9+) 规则,其中使用java.lang.System. 在2011 年 12 月的回答 中 最初提到了这一点。 **

System.exit(…)

使用ExpectedSystemExit规则来验证是否System.exit(鈥�)调用。 您也可以验证退出状态。

例如:

public void MyTest {
    @Rule
    public final ExpectedSystemExit exit = ExpectedSystemExit.none();

    @Test
    public void noSystemExit() {
        //passes
    }

    @Test
    public void systemExitWithArbitraryStatusCode() {
        exit.expectSystemExit();
        System.exit(0);
    }

    @Test
    public void systemExitWithSelectedStatusCode0() {
        exit.expectSystemExitWithStatus(0);
        System.exit(0);
    }
}

解决方法

我有一些方法应该调用System.exit()某些输入。不幸的是,测试这些情况会导致 JUnit
终止!将方法调用放在新线程中似乎没有帮助,因为System.exit()终止了
JVM,而不仅仅是当前线程。是否有任何常见的模式来处理这个问题?例如,我可以用存根代替System.exit()吗?

[编辑] 有问题的类实际上是一个命令行工具,我试图在 JUnit 中进行测试。也许 JUnit
根本就不是适合这项工作的工具?欢迎提出补充回归测试工具的建议(最好是与 JUnit 和 EclEmma 很好集成的工具)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。