DEV Community

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

Posted on

33 2

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

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

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!

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more