在單元測試中管理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.exit() 的系統規則。以下範例使用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中文網其他相關文章!