1. Información general
En este tutorial rápido, nos centraremos en cómo configurar una llamada a un método para lanzar una excepción con Mockito.
Para obtener más información sobre la biblioteca, consulte también nuestra serie Mockito.
Aquí hay una clase de diccionario simple que usaremos en estos ejemplos:
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 de devolución no nulo
Primero, si el tipo de retorno de nuestro método no es nulo , podemos usar 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"); }
Tenga en cuenta que configuramos el método getMeaning () , que devuelve un valor de tipo String , para lanzar una NullPointerException cuando se llama.
3. Vacío Tipo de retorno
Ahora, si nuestro método devuelve vacío, usaremos 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"); }
Aquí, configuramos un método add () , que devuelve void , para lanzar IllegalStateException cuando se llama.
No podemos usar when (). ThenThrow () con el tipo de retorno void ya que el compilador no permite métodos void entre corchetes.
4. Excepción como objeto
Acerca de la configuración de la excepción en sí, podemos pasar la clase de la excepción como en nuestros ejemplos anteriores o como un objeto:
@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"); }
Y también podemos hacer lo mismo 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. Espía
También podemos configurar Spy para lanzar una excepción de la misma manera que lo hicimos con el simulacro:
@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. Conclusión
En este artículo, exploramos cómo configurar llamadas a métodos para lanzar una excepción en Mockito.
Como siempre, el código fuente completo se puede encontrar en GitHub.