ホームページ > Java > &#&チュートリアル > JUnit で System.exit() を呼び出すメソッドをテストするにはどうすればよいですか?

JUnit で System.exit() を呼び出すメソッドをテストするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-16 05:36:03
オリジナル
474 人が閲覧しました

How Can I Test Methods Invoking System.exit() in JUnit?

単体テストでの System.exit() 呼び出しの管理

JUnit 環境では、System.exit() を呼び出すメソッドのテストが課題となります。 System.exit() が呼び出されると、テスト プロセスを含む Java 仮想マシン (JVM) が終了します。

一般的なアプローチ:

  • System.exit(): を置き換えます。スタブ化またはモック化を可能にするテスト ライブラリの使用を検討してください。 System.exit()。このアプローチにより、JVM はテスト目的で実行し続けることが保証されます。
  • JVM 終了の防止: System.exit() による JVM の終了を防ぐカスタム セキュリティ マネージャーを実装します。これには、終了しようとしてスローされた SecurityException のキャッチが含まれます。
  • JUnit 4.9 システム ルール: JUnit バージョン 4.9 以降では、システム ルールを利用して単体テスト内で System.exit() を特別に処理します。 System.exit() が呼び出されたことを確認し、終了ステータスをアサートすることもできます。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート