Lançamento de exceção de zombaria usando o Mockito
1. Visão geral
Neste tutorial rápido - vamos nos concentrar em como configurar uma chamada de método para lançar uma exceção com o Mockito.
Para obter mais informações sobre a biblioteca, verifique também nossoMockito series.
Aqui está uma classe de dicionário simples que usaremos nestes exemplos:
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 retorno não -Void
Primeiro, se nosso tipo de retorno de método não forvoid, podemos usarwhen().thenThrow():
@Test(expected = NullPointerException.class)
public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
when(dictMock.getMeaning(anyString()))
.thenThrow(NullPointerException.class);
dictMock.getMeaning("word");
}
Observe, configuramos o métodogetMeaning() - que retorna um valor do tipoString - para lançar umNullPointerException quando chamado.
3. Void Tipo de retorno
Agora, se nosso método retornarvoid,, usaremosdoThrow():
@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");
}
Aqui, configuramos um métodoadd() - que retornavoid - para lançarIllegalStateException quando chamado.
Não podemos usarwhen().thenThrow() com tipo de retornovoid, pois o compilador não permite métodosvoid entre colchetes.
4. Exceção como objeto
Sobre a configuração da própria exceção, podemos passar a classe da exceção como em nossos exemplos anteriores ou como um 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");
}
E podemos fazer o mesmo comdoThrow() também:
@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. Spy
Também podemos configurarSpy para lançar uma exceção da mesma forma que fizemos com o 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. Conclusão
Neste artigo, exploramos como configurar chamadas de método para lançar uma exceção no Mockito.
Como sempre, o código-fonte completo pode ser encontradoover on GitHub.