首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JUnit测试中处理System.exit(0)

在JUnit测试中处理System.exit(0)
EN

Stack Overflow用户
提问于 2011-05-26 23:40:57
回答 4查看 17K关注 0票数 12

我正在为现有的Java Swing应用程序实现一些测试,这样我就可以安全地重构和扩展代码,而不会破坏任何东西。我从JUnit中的一些单元测试开始,因为这似乎是最简单的入门方法,但现在我的首要任务是创建一些端到端测试来作为一个整体来测试应用程序。

我在每次测试中重新启动应用程序,将每个测试方法放在单独的测试用例中,并在Ant的junit任务中使用fork="yes"选项。但是,我希望作为测试实现的一些用例涉及用户退出应用程序,这会导致其中一个方法调用System.exit(0)。这被JUnit认为是一个错误:junit.framework.AssertionFailedError: Forked Java VM exited abnormally

有没有办法告诉JUnit,退出时返回代码为零实际上是可以的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-26 23:48:23

我如何处理这个问题是安装一个安全管理器,它在调用System.exit时抛出异常。然后是捕获异常的代码,并且不会导致测试失败。

代码语言:javascript
复制
public class NoExitSecurityManager
    extends java.rmi.RMISecurityManager
{
    private final SecurityManager parent;

    public NoExitSecurityManager(final SecurityManager manager)
    {
        parent = manager;
    }

    public void checkExit(int status)
    {
        throw new AttemptToExitException(status);
    }

    public void checkPermission(Permission perm)
    {
    }
}

然后在代码中,类似于:

代码语言:javascript
复制
catch(final Throwable ex)
{
    final Throwable cause;

    if(ex.getCause() == null)
    {
        cause = ex;
    }
    else
    {
        cause = ex.getCause();
    }

    if(cause instanceof AttemptToExitException)
    {
        status = ((AttemptToExitException)cause).getStatus();
    }
    else
    {
        throw cause;
    }
}

assertEquals("System.exit must be called with the value of " + expectedStatus, expectedStatus, status);
票数 8
EN

Stack Overflow用户

发布于 2011-12-29 00:36:06

System Rules有一个名为ExpectedSystemExit的JUnit规则。使用此规则,您可以测试调用System.exit(...)的代码:

代码语言:javascript
复制
public class MyTest {
    @Rule
    public final ExpectedSystemExit exit = ExpectedSystemExit.none();

    @Test
    public void systemExitWithArbitraryStatusCode() {
        exit.expectSystemExit();
        /* the code under test, which calls System.exit(...)
         * with an arbitrary status
         */
    }

    @Test
    public void systemExitWithSelectedStatusCode0() {
        exit.expectSystemExitWithStatus(0);
        //the code under test, which calls System.exit(0)
    }
}

系统规则至少需要JUnit 4.9。

完全公开:我是系统规则的作者。

票数 31
EN

Stack Overflow用户

发布于 2011-05-26 23:44:07

您是否可以将“系统退出”抽象为一个新的依赖项,以便在您的测试中只有一个假的,它记录了exit已被调用的事实(以及值),但在实际应用程序中使用调用System.exit的实现?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6141252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档