Zombando de métodos de vácuo com o Mockito

Zombando de métodos de vácuo com o Mockito

1. Visão geral

Neste breve tutorial, nos concentramos em simular métodosvoid com Mockito.

Leitura adicional:

Recursos do Java 8 de Mockito

Visão geral do suporte ao Java 8 na estrutura do Mockito, incluindo Streams e métodos de interface padrão

Read more

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

Aprenda a configurar uma chamada de método para lançar uma exceção no Mockito.

Read more

Tal como acontece com outros artigos focados na estrutura Mockito (comoMockito Verify,Mockito When/Then eMockito’s Mock Methods), a classeMyList mostrada abaixo será usada como colaboradora em casos de teste. Adicionaremos um novo método para este tutorial:

public class MyList extends AbstractList {

    @Override
    public void add(int index, String element) {
        // no-op
    }
}

2. Simulação e verificação simples

Os métodosVoid podem ser usados ​​com os métodosdoNothing(), doThrow(), and doAnswer() do Mockito, tornando a simulação e verificação intuitiva:

@Test
public void whenAddCalledVerified() {
    MyList myList = mock(MyList.class);
    doNothing().when(myList).add(isA(Integer.class), isA(String.class));
    myList.add(0, "");

    verify(myList, times(1)).add(0, "");
}

No entanto,doNothing() é o comportamento padrão do Mockito para métodos nulos.

Esta versão dewhenAddCalledVerified() realiza a mesma coisa que a anterior:

@Test
public void whenAddCalledVerified() {
    MyList myList = mock(MyList.class);
    myList(0, "");

    verify(myList, times(1)).add(0, "");
}

DoThrow() gera uma exceção:

@Test(expected = Exception.class)
public void givenNull_AddThrows() {
    MyList myList = mock(MyList.class);
    doThrow().when(myList).add(isA(Integer.class), isNull());

    myList.add(0, null);
}

CobriremosdoAnswer() abaixo.

3. Captura de Argumento

Uma razão para substituir o comportamento padrão comdoNothing() é capturar argumentos.

No exemplo acima,verify() é usado para verificar os argumentos passados ​​paraadd().

No entanto, podemos precisar capturar os argumentos e fazer algo mais com eles. Nesses casos, usamosdoNothing() exatamente como fizemos acima, mas com umArgumentCaptor:

@Test
public void whenAddCalledValueCaptured() {
    MyList myList = mock(MyList.class);
    ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class);
    doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
    myList.add(0, "captured");

    assertEquals("captured", valueCapture.getValue());
}

4. Atender uma chamada paraVoid

Um método pode executar um comportamento mais complexo do que simplesmente adicionar ou definir valor. Para essas situações, podemos usarAnswer do Mockito para adicionar o comportamento de que precisamos:

@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer((Answer) invocation -> {
        Object arg0 = invocation.getArgument(0);
        Object arg1 = invocation.getArgument(1);

        assertEquals(3, arg0);
        assertEquals("answer me", arg1);
        return null;
    }).when(myList).add(any(Integer.class), any(String.class));
    myList.add(3, "answer me");
}

Conforme explicado emMockito’s Java 8 Features, usamos um lambda comAnswer para definir o comportamento personalizado paraadd().

5. Zombaria parcial

Zombarias parciais também são uma opção. doCallRealMethod() do Mockito pode ser usado para métodosvoid:

@Test
public void whenAddCalledRealMethodCalled() {
    MyList myList = mock(MyList.class);
    doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
    myList.add(1, "real");

    verify(myList, times(1)).add(1, "real");
}

Isso nos permite chamar o método real é chamado e verificá-lo ao mesmo tempo.

6. Conclusão

Neste breve tutorial, cobrimos quatro maneiras diferentes de abordar os métodosvoid ao testar com o Mockito.

Como sempre, os exemplos estão disponíveis emthis GitHub project.