163 votes

Mockito Comment simuler et affirmer une exception levée ?

J'utilise mockito dans un test junit. Comment faire pour qu'une exception se produise et ensuite affirmer qu'elle s'est produite (pseudo-code générique) ?

16voto

Duncan Points 22780

Faites en sorte que l'exception se passe comme ceci :

when(obj.someMethod()).thenThrow(new AnException());

Vérifiez que cela s'est produit soit en affirmant que votre test lèvera une telle exception :

@Test(expected = AnException.class)

Ou par une vérification normale du simulacre :

verify(obj).someMethod();

Cette dernière option est nécessaire si votre test est conçu pour prouver que le code intermédiaire gère l'exception (c'est-à-dire que l'exception ne sera pas levée par votre méthode de test).

15voto

Rodrigo Martins Points 273

Utilisez DoThrow de Mockito et ensuite attraper l'exception désirée pour affirmer qu'elle a été levée plus tard.

@Test
public void fooShouldThrowMyException() {
    // given
    val myClass = new MyClass();
    val arg = mock(MyArgument.class);
    doThrow(MyException.class).when(arg).argMethod(any());
    Exception exception = null;

    // when
    try {
        myClass.foo(arg);
    } catch (MyException t) {
        exception = t;
    }

    // then
    assertNotNull(exception);
}

8voto

En utilisant mockito, vous pouvez faire en sorte que l'exception se produise.

when(testingClassObj.testSomeMethod).thenThrow(new CustomException());

En utilisant Junit5, vous pouvez asserter une exception, qui affirme si que L'exception est déclenchée lorsque méthode de test est invoquée.

@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
    final ExpectCustomException expectEx = new ExpectCustomException();

     InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
            expectEx.constructErrorMessage("sample ","error");
        });
    assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}

Trouvez un échantillon ici : assert exception junit

7voto

Chetan Botre Points 101

Je pense que ça devrait le faire pour vous.

assertThrows(someException.class, ()-> mockedServiceReference.someMethod(param1,parme2,..)) ;

3voto

JediCate Points 141

Ou si votre exception est levée depuis le constructeur d'une classe :

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void myTest() {    

    exception.expect(MyException.class);
    CustomClass myClass= mock(CustomClass.class);
    doThrow(new MyException("constructor failed")).when(myClass);  

}

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