System.exit()-Aufrufe in Unit-Tests verwalten
Das Testen von Methoden, die System.exit() aufrufen, stellt in JUnit-Umgebungen eine Herausforderung dar. Wenn System.exit() aufgerufen wird, beendet es die Java Virtual Machine (JVM), einschließlich des Testprozesses.
Gemeinsame Ansätze:
Beispiel für die Verwendung von NoExitSecurityManager:
Der folgende Java-Code demonstriert die Verwendung von a Benutzerdefinierter Sicherheitsmanager, um die JVM-Beendigung während des Tests zu verhindern:
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); } } }
Systemregeln für JUnit 4.9:
JUnit 4.9 und höher bieten Systemregeln, die speziell für die Verarbeitung von System.exit() entwickelt wurden. Das folgende Beispiel verwendet die ExpectedSystemExit-Regel, um zu überprüfen, ob System.exit() aufgerufen wird und den Exit-Status:
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:
Beachten Sie, dass für Ab Java 21 müssen Sie die Systemeigenschaft -Djava.security.manager=allow festlegen, um zu verhindern, dass System.exit() die JVM währenddessen beendet testen.
Das obige ist der detaillierte Inhalt vonWie kann ich Methoden testen, die System.exit() in JUnit aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!