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!
Post muito bom, estava com dúvida em como implementar os mock objects, algo que ajuda demais nos testes, principalmente em classes dependentes, testando o que interessa.
Continue assim, sempre venho ver algo novo sobre tdd aqui, parabéns.