Maison  >  Article  >  Java  >  Comment puis-je tester des méthodes appelant System.exit() dans JUnit ?

Comment puis-je tester des méthodes appelant System.exit() dans JUnit ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-16 05:36:03373parcourir

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

Gestion des appels System.exit() dans les tests unitaires

Les méthodes de test qui invoquent System.exit() posent un défi dans les environnements JUnit. Lorsque System.exit() est appelé, il met fin à la machine virtuelle Java (JVM), y compris le processus de test.

Approches courantes :

  • Remplacez System.exit() : Envisagez d'utiliser une bibliothèque de tests qui permet de stubbing ou de se moquer de System.exit(). Cette approche garantit que la JVM continue de fonctionner à des fins de test.
  • Empêcher la résiliation de la JVM : Implémentez un gestionnaire de sécurité personnalisé qui empêche System.exit() de mettre fin à la JVM. Cela implique d'attraper l'exception SecurityException lancée en tentant de quitter.
  • Règles système JUnit 4.9 : Pour les versions JUnit 4.9 et supérieures, utilisez les règles système pour gérer spécifiquement System.exit() dans les tests unitaires. Vous pouvez vérifier que System.exit() est appelé et même affirmer l'état de sortie.

Exemple d'utilisation de NoExitSecurityManager :

Le code Java suivant illustre l'utilisation d'un gestionnaire de sécurité personnalisé pour empêcher l'arrêt de la JVM pendant les tests :

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);
        }
    }
}

Règles système pour JUnit 4.9 :

JUnit 4.9 et versions ultérieures proposent des règles système spécifiquement conçues pour gérer System.exit(). L'exemple suivant utilise la règle ExpectedSystemExit pour vérifier que System.exit() est appelé et l'état de sortie :

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);
    }
}

Mise à jour JVM 2023 :

Notez que pour À partir de Java 21, vous devez définir la propriété système -Djava.security.manager=allow pour empêcher System.exit() de mettre fin à la JVM pendant tests.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn