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

标签 java junit

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

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

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

最佳答案

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

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。

完全披露:我是系统规则的作者。

关于java - 在 JUnit 测试中处理 System.exit(0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6141252/

相关文章:

android - 如何在同一测试类中添加多参数化单元测试

java - 如何使用 Mockito for page.map(mapper::toDto) 模拟 Mapstruct 的 toDto 方法

java - 我可以使用类变量将 Httpservletrequest/response 对象传递给 run() 方法吗?

java - 不会从 SharedPreferences 加载值 - 在计算中使用它们时,它们看起来是空白的

java - 连续向前和向后推进索引,无循环

java - 如何使用EasyMock模拟方法的方法?

java - 通过 Ant 运行测试时出现 NoClassDefFoundError 但在 Tomcat 中部署时工作正常

linux - linux安装jdk的正确方法是什么

java - String.replaceAll() 不适用于某些字符串

java - 如何使用 JUnit 在 Spring 中测试 ConfigurationProperties?