Menguruskan Panggilan System.exit() dalam Ujian Unit
Kaedah ujian yang menggunakan System.exit() menimbulkan cabaran dalam persekitaran JUnit. Apabila System.exit() dipanggil, ia menamatkan Mesin Maya Java (JVM), termasuk proses ujian.
Pendekatan Biasa:
Contoh Menggunakan NoExitSecurityManager:
Kod Java berikut menunjukkan menggunakan pengurus keselamatan tersuai untuk menghalang penamatan JVM semasa ujian:
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); } } }
Peraturan Sistem untuk JUnit 4.9 :
JUnit 4.9 dan ke atas menawarkan peraturan sistem yang direka khusus untuk mengendalikan Sistem. keluar(). Contoh berikut menggunakan peraturan ExpectedSystemExit untuk mengesahkan bahawa System.exit() dipanggil dan status keluar:
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); } }
Kemas Kini JVM 2023:
Perhatikan bahawa untuk Java 21 dan seterusnya, anda mesti menetapkan sifat sistem -Djava.security.manager=allow untuk menghalang System.exit() daripada menamatkan JVM semasa ujian.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menguji Kaedah Menggunakan System.exit() dalam JUnit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!