DEV Community

Cover image for Mockito: como utilizar de maneira simples
Daiene Lima
Daiene Lima

Posted on

Mockito: como utilizar de maneira simples

Eu utilizo o Mockito tem algum tempo e é uma ferramenta muito poderosa. Sem ele criar testes seria muito mais verboso e de certa forma complicado.
Depois de entender bem o conceito e a forma de utilizar o desenvolvimento de testes fica muito mais rápido e assertivo.

O que é o Mockito?

O Mockito é um framework de Test and Spy e o seu principal objetivo é simular a instancia de classes e comportamento de métodos. Ao mockar uma dependência com o mockito, eu faço com que a classe que vai ser testada simule o método testado e suas dependências. Durante o mock eu posso configurar retorno e ações de acordo com o necessidade do teste.

Principais funções

  • Mock: cria uma instancia de uma classe, porém Mockada. Se você chamar um metodo ele não irá chamar o metodo real, a não ser que você queira.
  • Spy: cria uma instancia de uma classe, que você pode mockar ou chamar os metodos reais. É uma alternativa ao InjectMocks, quando é preciso mockar metodos da propria classe que esta sendo testada.
  • InjectMocks: criar uma intancia e injeta as dependências necessárias que estão anotadas com @Mock.
  • Verify: verifica a quantidade de vezes e quais parametros utilizados para acessar um determinado metodo.
  • When: Após um mock ser criado, você pode configurar ações na chamada e o retorno.
  • Matchers: permite a verificação por meio de matchers de argumentos (anyObject(), anyString() …)

Criando um mock

Há duas formas de criar um mock usando o mockito por meio de um método estático ou com a anotação @Mock

  • Utilizando método statico ```

var EmployeeRepository = Mockito.mock(EmployeeRepository.class)

* anotação @Mock
Enter fullscreen mode Exit fullscreen mode

@Mock
private EmployeeRepository employeeRepository;

### Configurando a classe testada
Ao declarar a classe vamos anotar ela com @InjectMocks. O Mockito vai criar uma instância real dessa classe e injetar todos os objetos @ Mock que foram declarados na classe de teste.
Enter fullscreen mode Exit fullscreen mode

@InjectMocks
private EmployeeController employeeController;

### Hibilitando as anotações
Para essas anotações @Mock e @InjectMocks funcionar, é preciso habilita-las. existem duas formas:
* Anotando a classe de teste com @RunWith(MockitoJUnitRunner.class)
Enter fullscreen mode Exit fullscreen mode

@RunWith(MockitoJUnitRunner.class)
public class EmployeeControllerTest {}

* Usando o MockitoAnnotations.initMocks () antes dos testes

Enter fullscreen mode Exit fullscreen mode

@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}


### Testando um metodo void
O método que vai ser testado:
Enter fullscreen mode Exit fullscreen mode

@DeleteMapping("/employees/{id}")
public void deleteEmployee(@PathVariable Long id) {
repository.deleteById(id);
}

O teste
Enter fullscreen mode Exit fullscreen mode

@test
public void deleteEmployee() {
employeeController.deleteEmployee(1L);
Mockito.verify(employeeRepository, Mockito.times(1)).deleteById(1L);
}

Primeiro chamamos o método que vai ser testado e passamos os 
parâmetros necessários.
Em seguida usamos o _Mockito.verify_ para verificar se durante a execução das classes mocadas foi chamado o método em questão.
Podemos verificar varias coisas com _Mockito.verify_ numero de vezes que executou, parâmetros recebidos e etc.

### @Spy Annotation
Usamos o @Spy para espionar uma instância existente.
No exemplo abaixo eu adicionei dois elementos a uma lista e em seguida verifiquei se os elementos foram mesmo inseridos.

Enter fullscreen mode Exit fullscreen mode

@test
public void spyTest() {
List employees = Mockito.spy(new ArrayList());
Employee one = new Employee("Bilbo Baggins", "burglar");
Employee two = new Employee("Frodo Baggins", "thief");

    employees.add(one);
    employees.add(two);

    Mockito.verify(employees).add(one);
    Mockito.verify(employees).add(two);
    assertEquals(2, employees.size());

    Mockito.doReturn(100).when(employees).size();
    assertEquals(100, employees.size());
}
Enter fullscreen mode Exit fullscreen mode
* employees.add() para adicionar elementos a employees.
* employees.size() para retornar 100 em vez de 2 usando Mockito.doReturn()

### Método when
Através dele é possível simular chamadas a recursos externos a classe, como acesso a um banco de dados por exemplo, sem se preocupar como funcionará essa consulta, não é responsabilidade desse teste.
A sintaxe do when é essa:
* when(employeeRepository.save(Mockito.any(Employee.class))).thenReturn(employee);
* when(employeeRepository.save(Mockito.eq(employeeInput))).thenReturn(employee);
* when(employeeRepository.save(Mockito.any())).thenReturn(employee);

Enter fullscreen mode Exit fullscreen mode

@test
public void newEmployee_test() {
Employee employee = EmployeeTest.create();
when(employeeRepository.save(Mockito.any(Employee.class))).thenReturn(employee);
ResponseEntity newEmployee = employeeController.newEmployee(employee);
assertEquals(employee.getName(), newEmployee.getBody().getName());
assertEquals(employee.getRole(), newEmployee.getBody().getRole());
}


![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mukdycphq9tqiv813dcy.png)

[Repo com mais exemplos](https://github.com/daienelima/exemplo-HATEOAS)




Enter fullscreen mode Exit fullscreen mode

Top comments (2)

Collapse
 
tfpmonteiro profile image
Talita Monteiro

Muito obrigada pelo artigo, me ajudou demais!!!!!!!!!!!!!

Collapse
 
hsmiranda profile image
Herberson S.M.

Excelente artigo!