単体テストでの System.exit() 呼び出しの管理
JUnit 環境では、System.exit() を呼び出すメソッドのテストが課題となります。 System.exit() が呼び出されると、テスト プロセスを含む Java 仮想マシン (JVM) が終了します。
一般的なアプローチ:
NoExitSecurityManager の使用例:
次の Java コードは、カスタム セキュリティ マネージャーによる JVM の終了を防止するtesting:
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 Update:
Java 21 以降では、System.exit() が終了しないようにシステム プロパティ -Djava.security.manager=allow を設定する必要があります。テスト中の JVM。
以上がJUnit で System.exit() を呼び出すメソッドをテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。