在单元测试中管理 System.exit() 调用
调用 System.exit() 的测试方法在 JUnit 环境中提出了挑战。当 System.exit() 被调用时,它会终止 Java 虚拟机 (JVM),包括测试进程。
常见方法:
使用 NoExitSecurityManager 的示例:
以下 Java 代码演示了如何使用自定义安全管理器,以防止测试期间 JVM 终止:
public class NoExitTestCase extends TestCase { private static class NoExitSecurityManager extends SecurityManager { @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); 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); } } }
JUnit 4.9 的系统规则:
JUnit 4.9 及更高版本提供专门设计用于处理 System.Drawing 的系统规则。出口()。以下示例使用 ExpectedSystemExit 规则来验证 System.exit() 是否被调用以及退出状态:
public class 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); } }
2023 JVM 更新:
请注意,对于从 Java 21 开始,您必须设置系统属性 -Djava.security.manager=allow 以防止 System.exit() 在测试期间终止 JVM。
以上是如何在 JUnit 中测试调用 System.exit() 的方法?的详细内容。更多信息请关注PHP中文网其他相关文章!