Criando Mocks com Mockito

olá Pessoal,
No post de hoje vamos ver como usar o API Mockito para criação de objetos mocks. No ultimo post vimos o que são mocks, mas eu já tinha falado rapidamente do Mockito. Usarei o mesmo exemplo visto no post passado, porém agora teremos mocks in action.
Lets go…
Usando JUnit com o Mockito
Para não ter que repetir o código anterior, neste post adicionei apenas a classe que tem o unit test. Então, vou considerar que você viu o nosso post sobre Mocks.
Agora precisamos testar a classe AlugaCarro e ver se de fato ela está retornando um objeto que possui as informações que esperamos que tenha.
Classe de teste
publicclass CarroAlugadoTest {
@Mock
private AlugaCarro alugaCarro;//my interface
public CarroAlugadoTest() {
alugaCarro = Mockito.mock(Cliente.class);
}
@Test
publicvoid alugaCarroParaCliente(){
//o caraquerecebeoscarrosalugados
CarroAlugado car = new CarroAlugado(alugaCarro);
String resultadoEsperado = “Camilo Golf”;
/*
* aqui o clientecamiloestáreservando o carro golf
*/
Mockito.when(alugaCarro.getNomeCliente()).thenReturn(“Camilo “);
Mockito.when(alugaCarro.getModeloCarro()).thenReturn(“Golf”);
String verdadeiroResultado = car.getAlugaCarro().getNomeCliente() + car.getAlugaCarro().getModeloCarro();
Mockito.verify(alugaCarro).getNomeCliente();
assertEquals(resultadoEsperado,verdadeiroResultado);
}
Explicado partes importantes do código
Passo 1
Precisamos fazer a mock,ou seja, “mockar” uma classe/interface, há várias formas de fazer isso, usaremos o modo mais simples, que é usar annotations @Mock na variável que vai ser o objeto e “instanciar” ela no construtor, pois quando a classe for carregada a variável será “mockada”.
@Mock
private AlugaCarro alugaCarro;
public CarroAlugadoTest() {
alugaCarro = Mockito.mock(Cliente.class);
}
Passo 2
Criamos um teste onde vamos verificar se um carro foi alugado para o cliente.
Primeiro passo foi passar o objeto “mockado” que representa “o cliente” para a classe CarroAlugado, pois é isso que ela espera receber, um objeto que alugou um carro.
- CarroAlugado car = new CarroAlugado(alugaCarro);
Em seguida vamos configurar os valores para o método que recebe o nome do cliente e o que recebe o nome do carro alugado. Porém, aqui usaremos API Mockito. Essa linha de código será executada quando o método for invocado.
- Mockito.when(alugaCarro.getNomeCliente()).thenReturn(“Camilo “);
- Mockito.when(alugaCarro.getModeloCarro()).thenReturn(“Golf”);
A leitura poderia ser algo do tipo: “quando o metodo getNomeCliente() for chamado, então configure o valor dele para “camilo”.
Na linha seguinte, observe que chamamos os métodos, que acreditamos estarem com um valor. E ai o mockito entra in action, quando um objeto, chama um daqueles métodos, ele configura os valores que estão no thenReturn().
- String verdadeiroResultado = car.getAlugaCarro().getNomeCliente() + car.getAlugaCarro().getModeloCarro();
- Mockito.verify(alugaCarro).getNomeCliente();
O método verify() apenas verifica se o método foi chamado, no API Docs do Mockito, há outras pessoas de verificação, como por exemplo:
- verificar se o metodo getNomeCliente() foi chamado pelo menos 1 vez, ou mais vezes;
- verificar se nunca foi chamado.
O assertEquals é somente para verificar se estamos recebendo o valor esperado.
Outro teste que foi implementado:
@Test
publicvoid verificaSeUmMetodoNuncaFoiExecutado(){
CarroAlugado carroAlugado = new CarroAlugado(alugaCarro);
Mockito.when(alugaCarro.getModeloCarro()).thenReturn(“Civic”);
//verificase o metodo getNomeCliente() nuncafoiexecutado
String modeloCarro = carroAlugado.getAlugaCarro().getModeloCarro();
Mockito.verify(alugaCarro, Mockito.never()).getNomeCliente();
}
Um video
Um video do Vinicius mostra a diferença entre mock & Stubs que achei muito bom.
http://viniciusquaiato.com/blog/diferenca-entre-mocks-e-stubs/
Conclusão
Uma outra dica é você gastar um bom tempo ali na documentação do Mockito, ela é bastante rica e de fácil leitura. A API não é tão grande e muito menos complexa, basta um pouco de pratica e sabendo como usar cada recurso, tá feito.
Vou ficando por aqui e espero que tenham gostado do post.
Abracos, see ya!


