Rumah >Java >javaTutorial >Bagaimana untuk Menguji Kaedah yang Memanggil `System.exit()` dalam JUnit?

Bagaimana untuk Menguji Kaedah yang Memanggil `System.exit()` dalam JUnit?

Barbara Streisand
Barbara Streisandasal
2024-11-22 10:17:10737semak imbas

How to Test Methods that Call `System.exit()` in JUnit?

Bagaimana untuk Menguji Kaedah yang Memanggil System.exit()?

Isu:

Kaedah ujian yang memanggil System.exit() boleh mencabar kerana JUnit ditamatkan apabila System.exit() digunakan.

Penyelesaian:

Terdapat beberapa pendekatan untuk menangani isu ini:

1. Elakkan Menggunakan System.exit():

Daripada menggunakan System.exit(), pertimbangkan untuk menaikkan pengecualian yang tidak ditandai. Ini membolehkan JUnit menangkap pengecualian dan melaporkan kegagalan ujian tanpa menamatkan JVM.

2. Cegah System.exit() daripada Keluar dari JVM:

Gunakan pengurus keselamatan yang menghalang panggilan ke System.exit(). Ini boleh dicapai dengan mencipta kelas pengurus keselamatan tersuai dan mengubah suai kes ujian untuk dijalankan dengannya.

3. Gunakan Peraturan Sistem (JUnit 4.9 ):

Gunakan peraturan ExpectedSystemExit untuk mengesahkan bahawa System.exit() dipanggil dan menguji status keluar. Peraturan ini menyediakan cara yang mudah untuk mengendalikan System.exit() dalam ujian.

4. Tetapkan Harta Sistem (Java 21 ):

Untuk mengelakkan JVM daripada ditamatkan disebabkan oleh System.exit(), tetapkan sifat sistem -Djava.security.manager=allow.

Contoh Kod Menggunakan Pengurus Keselamatan:

public class NoExitTestCase extends TestCase {

    protected static class ExitException extends SecurityException {
        public final int status;
        public ExitException(int status) {
            super("There is no escape!");
            this.status = status;
        }
    }

    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 testExit() throws Exception {
        try {
            System.exit(42);
        } catch (ExitException e) {
            assertEquals("Exit status", 42, e.status);
        }
    }
}

Atas ialah kandungan terperinci Bagaimana untuk Menguji Kaedah yang Memanggil `System.exit()` dalam JUnit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn