441 votes

Comment tester qu'aucune exception n'est levée ?

Je sais qu'une façon de le faire serait :

@Test
public void foo() {
   try {
      // execute code that you expect not to throw Exceptions.
   } catch(Exception e) {
      fail("Should not have thrown any exception");
   }
}

Existe-t-il un moyen plus propre de procéder ? (Probablement en utilisant la fonction @Rule ?)

14 votes

Un test JUnit est considéré comme ayant échoué s'il lève une exception autre qu'une exception attendue. En général, aucune exception n'est attendue.

2 votes

N'y a-t-il pas une distinction entre échec et erreur dans JUnit ? Le premier signifie que le test a échoué, le second que quelque chose d'inattendu s'est produit.

2 votes

31voto

Ben Tennyson Points 19

Si vous êtes assez malchanceux pour attraper toutes les erreurs dans votre code. Vous pouvez stupidement faire

class DumpTest {
    Exception ex;
    @Test
    public void testWhatEver() {
        try {
            thisShouldThrowError();
        } catch (Exception e) {
            ex = e;
        }
        assertEquals(null,ex);
    }
}

1 votes

Juste une petite suggestion, Exception ex devrait être = null; avant de pouvoir le tester.

4 votes

Ce n'est pas une bonne solution. Si la méthode qui ne devrait pas lever une exception le fait, vous n'obtiendrez pas de message d'erreur utile. Appelez simplement la méthode qui ne devrait pas lever d'exception et testez sa valeur de retour (ou ses effets secondaires, comme l'enregistrement de l'exception). Si, par la suite, une exception est levée de manière inattendue, le test échouera.

6 votes

Ou simplement mettre Assert.fail() dans le catch, plus facile et plus joli IMO.

27voto

Dinesh Arora Points 956

Bien que ce billet date de 6 ans maintenant, beaucoup de choses ont changé dans le monde de Junit. Avec Junit5, vous pouvez maintenant utiliser

org.junit.jupiter.api.Assertions.assertDoesNotThrow()

Ex :

public void thisMethodDoesNotThrowException(){
   System.out.println("Hello There");
}

@Test
public void test_thisMethodDoesNotThrowException(){
  org.junit.jupiter.api.Assertions.assertDoesNotThrow(
      ()-> thisMethodDoesNotThrowException()
    );
}

J'espère que cela aidera les personnes qui utilisent une version plus récente de Junit5.

8voto

razalghul Points 89

JUnit5 ajoute la méthode assertAll() dans ce but précis.

assertAll( () -> foo() )

source : API JUnit 5

7voto

pirho Points 5491

Pour tester un scénario avec une méthode void comme

void testMeWell() throws SomeException {..}

à ne pas jeter une exception :

Junit5

assertDoesNotThrow(() -> {
    testMeWell();
});

2voto

Douglas Caina Points 100

Je finis par faire comme ceci

@Test
fun `Should not throw`() {
    whenever(authService.isAdmin()).thenReturn(true)

    assertDoesNotThrow {
        service.throwIfNotAllowed("client")
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X