En effet, Derkeiler.com suggère :
Au lieu de terminer par System.exit(whateverValue), pourquoi ne pas lancer une exception non vérifiée ? Dans une utilisation normale, elle dérivera jusqu'à l'attrapeur de dernière chance de la JVM et arrêtera votre script (à moins que vous ne décidiez de l'attraper quelque part en cours de route, ce qui pourrait s'avérer utile un jour).
Dans le scénario JUnit, il sera détecté par le programme JUnit fr. tel ou tel test a échoué et passera en douceur au suivant.
- Prévenir
System.exit()
pour quitter la JVM :
Essayez de modifier le TestCase pour qu'il s'exécute avec un gestionnaire de sécurité qui empêche l'appel à System.exit, puis attrapez l'exception de sécurité.
public class NoExitTestCase extends TestCase
{
protected static class ExitException extends SecurityException
{
public final int status;
public ExitException(int status)
{
super("There is no escape!");
this.status = status;
}
}
private static class NoExitSecurityManager extends SecurityManager
{
@Override
public void checkPermission(Permission perm)
{
// allow anything.
}
@Override
public void checkPermission(Permission perm, Object context)
{
// allow anything.
}
@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); // or save and restore original
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);
}
}
}
Mise à jour décembre 2012 :
Volonté propose dans les commentaires en utilisant Règles du système un ensemble de règles JUnit (4.9+) pour tester le code qui utilise java.lang.System
.
Cela a été mentionné initialement par Stefan Birkner en sa réponse en décembre 2011.
System.exit(…)
Utiliser le ExpectedSystemExit
pour vérifier que System.exit(…)
est appelé.
Vous pouvez également vérifier l'état de sortie.
Par exemple :
public void 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);
}
}
2 votes
Je suis curieux de savoir pourquoi une fonction appellerait System.exit()...
2 votes
Si vous appelez une fonction qui quitte l'application. Par exemple, si l'utilisateur tente d'effectuer une tâche qu'il n'est pas autorisé à effectuer plus de x fois de suite, vous le forcez à quitter l'application.
5 votes
Je continue à penser que dans ce cas, il devrait y avoir une façon plus agréable de quitter l'application plutôt que System.exit().
40 votes
Si vous testez main(), il est tout à fait logique d'appeler System.exit(). Nous avons une exigence selon laquelle, en cas d'erreur, un processus batch doit sortir avec la valeur 1 et, en cas de succès, sortir avec la valeur 0.
11 votes
Je ne suis pas d'accord avec tous ceux qui disent
System.exit()
est mauvais - votre programme doit échouer rapidement. Lancer une exception ne fait que prolonger une application dans un état invalide dans des situations où le développeur souhaite quitter le programme et provoque des erreurs parasites.3 votes
@ThomasOwens Je suis curieux de savoir pourquoi vous pensez que System.exit est mauvais ou n'est pas nécessaire. Je voudrais savoir comment retourner un lot avec un code de sortie 20 ou 30 à partir d'une application Java.