Lançamento de exceção de zombaria usando o Mockito

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.