Introducció

Mockito és una biblioteca de simulació (mocking) per a proves unitàries en Java. Permet crear objectes simulats (mocks) per provar el comportament de les classes sense necessitat de dependre de les seves implementacions reals. Això és especialment útil per a proves unitàries, ja que permet aïllar la lògica de la classe que s'està provant.

Objectius

En aquesta secció, aprendràs a:

  • Configurar Mockito en un projecte Spring Boot.
  • Crear objectes simulats.
  • Definir el comportament dels objectes simulats.
  • Verificar les interaccions amb els objectes simulats.

Configuració de Mockito

Per començar a utilitzar Mockito en el teu projecte Spring Boot, has d'afegir la dependència de Mockito al teu fitxer pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.11.2</version>
    <scope>test</scope>
</dependency>

Creant objectes simulats

Per crear un objecte simulat amb Mockito, utilitza l'anotació @Mock o el mètode Mockito.mock(). Aquí tens un exemple:

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.*;

public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testFindUserById() {
        MockitoAnnotations.openMocks(this);

        User mockUser = new User(1L, "John Doe");
        when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));

        User user = userService.findUserById(1L);

        assertEquals("John Doe", user.getName());
        verify(userRepository, times(1)).findById(1L);
    }
}

Explicació del codi

  1. Anotacions:

    • @Mock: Crea un objecte simulat de UserRepository.
    • @InjectMocks: Crea una instància de UserService i injecta els mocks anotats en aquesta instància.
  2. Inicialització de Mockito:

    • MockitoAnnotations.openMocks(this): Inicialitza les anotacions de Mockito.
  3. Definició del comportament:

    • when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser)): Defineix el comportament del mock userRepository per retornar un Optional amb mockUser quan es crida el mètode findById amb l'argument 1L.
  4. Verificació:

    • verify(userRepository, times(1)).findById(1L): Verifica que el mètode findById de userRepository es crida exactament una vegada amb l'argument 1L.

Exercicis pràctics

Exercici 1: Simulació bàsica

Crea una prova unitària per a un servei que depèn d'un repositori. Simula el comportament del repositori per retornar un objecte específic i verifica que el servei retorna l'objecte correcte.

Solució

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

public class ProductServiceTest {

    @Mock
    private ProductRepository productRepository;

    @InjectMocks
    private ProductService productService;

    @Test
    public void testGetProductById() {
        MockitoAnnotations.openMocks(this);

        Product mockProduct = new Product(1L, "Laptop");
        when(productRepository.findById(1L)).thenReturn(Optional.of(mockProduct));

        Product product = productService.getProductById(1L);

        assertEquals("Laptop", product.getName());
        verify(productRepository, times(1)).findById(1L);
    }
}

Exercici 2: Verificació d'interaccions

Crea una prova unitària per a un servei que crida diversos mètodes d'un repositori. Verifica que tots els mètodes es criden el nombre correcte de vegades.

Solució

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.*;

public class OrderServiceTest {

    @Mock
    private OrderRepository orderRepository;

    @InjectMocks
    private OrderService orderService;

    @Test
    public void testProcessOrder() {
        MockitoAnnotations.openMocks(this);

        Order mockOrder = new Order(1L, "Order1");
        when(orderRepository.save(any(Order.class))).thenReturn(mockOrder);

        orderService.processOrder(mockOrder);

        verify(orderRepository, times(1)).save(mockOrder);
        verify(orderRepository, times(1)).findById(mockOrder.getId());
    }
}

Errors comuns i consells

Errors comuns

  1. No inicialitzar Mockito: Assegura't de cridar MockitoAnnotations.openMocks(this) per inicialitzar les anotacions de Mockito.
  2. No definir el comportament del mock: Si no defineixes el comportament del mock, retornarà null per defecte.
  3. Verificació incorrecta: Assegura't de verificar les interaccions amb els mocks després de cridar el mètode que estàs provant.

Consells

  • Utilitza @InjectMocks per injectar automàticament els mocks en la instància de la classe que estàs provant.
  • Utilitza when per definir el comportament dels mocks abans de cridar el mètode que estàs provant.
  • Utilitza verify per assegurar-te que els mètodes dels mocks es criden el nombre correcte de vegades.

Conclusió

Mockito és una eina poderosa per a la simulació en proves unitàries. Permet crear objectes simulats, definir el seu comportament i verificar les interaccions amb ells. Amb aquesta secció, has après a configurar Mockito, crear objectes simulats, definir el seu comportament i verificar les interaccions. Practica amb els exercicis proporcionats per reforçar els conceptes apresos i millorar les teves habilitats en proves unitàries amb Mockito.

Curs de Spring Boot

Mòdul 1: Introducció a Spring Boot

Mòdul 2: Conceptes bàsics de Spring Boot

Mòdul 3: Construint serveis web RESTful

Mòdul 4: Accés a dades amb Spring Boot

Mòdul 5: Seguretat a Spring Boot

Mòdul 6: Proves a Spring Boot

Mòdul 7: Funcions avançades de Spring Boot

Mòdul 8: Desplegant aplicacions Spring Boot

Mòdul 9: Rendiment i monitorització

Mòdul 10: Millors pràctiques i consells

© Copyright 2024. Tots els drets reservats