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