Heim > Java > javaLernprogramm > Hauptteil

Wie kann ich Methoden testen, die System.exit() in JUnit aufrufen?

Linda Hamilton
Freigeben: 2024-11-16 05:36:03
Original
370 Leute haben es durchsucht

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

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:

  • Ersetzen Sie System.exit(): Erwägen Sie die Verwendung einer Testbibliothek, die das Stubbing oder Mocking von System.exit() ermöglicht. Dieser Ansatz stellt sicher, dass die JVM zu Testzwecken weiterhin ausgeführt wird.
  • JVM-Beendigung verhindern: Implementieren Sie einen benutzerdefinierten Sicherheitsmanager, der verhindert, dass System.exit() die JVM beendet. Dazu gehört das Abfangen der SecurityException, die beim Beendenversuch ausgelöst wird.
  • JUnit 4.9-Systemregeln: Für JUnit-Versionen 4.9 und höher verwenden Sie Systemregeln, um System.exit() innerhalb von Komponententests speziell zu behandeln. Sie können überprüfen, ob System.exit() aufgerufen wird, und sogar den Exit-Status bestätigen.

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);
        }
    }
}
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage