Eccezione beffarda Lancio con Mockito

1. Panoramica

In questo breve tutorial ci concentreremo su come configurare una chiamata al metodo per generare un'eccezione con Mockito.

Per ulteriori informazioni sulla libreria, controlla anche la nostra serie Mockito.

Ecco una semplice classe di dizionario che useremo in questi esempi:

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. Tipo di restituzione non annullato

Innanzitutto, se il tipo restituito dal nostro metodo non è void , possiamo usare 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"); } 

Si noti che abbiamo configurato il metodo getMeaning () , che restituisce un valore di tipo String , per generare un'eccezione NullPointerException quando viene chiamato.

3. Tipo restituito Void

Ora, se il nostro metodo restituisce void, useremo 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"); }

Qui, abbiamo configurato un metodo add () , che restituisce void , per lanciare IllegalStateException quando viene chiamato.

Non possiamo usare when (). ThenThrow () con il tipo di ritorno void poiché il compilatore non consente metodi void tra parentesi.

4. Eccezione come oggetto

Riguardo alla configurazione dell'eccezione stessa, possiamo passare la classe dell'eccezione come nei nostri esempi precedenti o come un oggetto:

@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"); }

E possiamo fare lo stesso anche con 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. Spia

Possiamo anche configurare Spy per lanciare un'eccezione nello stesso modo in cui abbiamo fatto con il mock:

@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. Conclusione

In questo articolo, abbiamo esplorato come configurare le chiamate al metodo per generare un'eccezione in Mockito.

Come sempre, il codice sorgente completo può essere trovato su GitHub.