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 :
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!