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 deUserService
i 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 mockuserRepository
per retornar unOptional
ambmockUser
quan es crida el mètodefindById
amb l'argument1L
.
-
Verificació:
verify(userRepository, times(1)).findById(1L)
: Verifica que el mètodefindById
deuserRepository
es 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à
null
per 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
@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
- 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