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
-
Anotacions:
@Mock: Crea un objecte simulat deUserRepository.@InjectMocks: Crea una instància deUserServicei injecta els mocks anotats en aquesta instància.
-
Inicialització de Mockito:
MockitoAnnotations.openMocks(this): Inicialitza les anotacions de Mockito.
-
Definició del comportament:
when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser)): Defineix el comportament del mockuserRepositoryper retornar unOptionalambmockUserquan es crida el mètodefindByIdamb l'argument1L.
-
Verificació:
verify(userRepository, times(1)).findById(1L): Verifica que el mètodefindByIddeuserRepositoryes crida exactament una vegada amb l'argument1L.
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
- No inicialitzar Mockito: Assegura't de cridar
MockitoAnnotations.openMocks(this)per inicialitzar les anotacions de Mockito. - No definir el comportament del mock: Si no defineixes el comportament del mock, retornarà
nullper defecte. - Verificació incorrecta: Assegura't de verificar les interaccions amb els mocks després de cridar el mètode que estàs provant.
Consells
- Utilitza
@InjectMocksper injectar automàticament els mocks en la instància de la classe que estàs provant. - Utilitza
whenper definir el comportament dels mocks abans de cridar el mètode que estàs provant. - Utilitza
verifyper 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
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte Spring Boot
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Configuració de Spring Boot
- Propietats de Spring Boot
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestionant mètodes HTTP
- Gestió d'excepcions en REST
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creant entitats JPA
- Utilitzant repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementant autenticació JWT
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ó
- Optimització del rendiment
- Monitorització amb Spring Boot Actuator
- Utilitzant Prometheus i Grafana
- Gestió de registres i logs
