Lancer d'exceptions moqueuses à l'aide de Mockito

1. Vue d'ensemble

Dans ce tutoriel rapide - nous allons nous concentrer sur la façon de configurer un appel de méthode pour lever une exception avec Mockito.

Pour plus d'informations sur la bibliothèque, consultez également notre série Mockito.

Voici une classe de dictionnaire simple que nous utiliserons dans ces exemples:

class MyDictionary { private Map wordMap = new HashMap(); public void add(String word, String meaning) { wordMap.put(word, meaning); } public String getMeaning(String word) { return wordMap.get(word); } }

2. Type de retour non annulé

Premièrement, si le type de retour de notre méthode n'est pas void, nous pouvons utiliser when (). ThenThrow () :

@Test(expected = NullPointerException.class) public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); when(dictMock.getMeaning(anyString())) .thenThrow(NullPointerException.class); dictMock.getMeaning("word"); } 

Remarquez, nous avons configuré la méthode getMeaning () - qui renvoie une valeur de type String - pour lancer une exception NullPointerException lorsqu'elle est appelée.

3. Void Type de retour

Maintenant, si notre méthode retourne void, nous utiliserons doThrow () :

@Test(expected = IllegalStateException.class) public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); doThrow(IllegalStateException.class) .when(dictMock) .add(anyString(), anyString()); dictMock.add("word", "meaning"); }

Ici, nous avons configuré une méthode add () - qui retourne void - pour lancer IllegalStateException lorsqu'elle est appelée.

Nous ne pouvons pas utiliser when (). ThenThrow () avec le type de retour void car le compilateur n'autorise pas les méthodes void entre crochets.

4. Exception en tant qu'objet

À propos de la configuration de l'exception elle-même, nous pouvons passer la classe de l'exception comme dans nos exemples précédents ou en tant qu'objet:

@Test(expected = NullPointerException.class) public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); when(dictMock.getMeaning(anyString())) .thenThrow(new NullPointerException("Error occurred")); dictMock.getMeaning("word"); }

Et nous pouvons faire la même chose avec doThrow () :

@Test(expected = IllegalStateException.class) public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { MyDictionary dictMock = mock(MyDictionary.class); doThrow(new IllegalStateException("Error occurred")) .when(dictMock) .add(anyString(), anyString()); dictMock.add("word", "meaning"); }

5. Espion

Nous pouvons également configurer Spy pour lancer une exception de la même manière que nous l'avons fait avec le simulacre:

@Test(expected = NullPointerException.class) public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { MyDictionary dict = new MyDictionary(); MyDictionary spy = Mockito.spy(dict); when(spy.getMeaning(anyString())) .thenThrow(NullPointerException.class); spy.getMeaning("word"); }

6. Conclusion

Dans cet article, nous avons exploré comment configurer les appels de méthode pour lever une exception dans Mockito.

Comme toujours, le code source complet peut être trouvé sur GitHub.