Introducción
Mockito es una biblioteca de simulación (mocking) para pruebas unitarias en Java. Permite crear objetos simulados (mocks) y definir su comportamiento, lo que facilita la prueba de componentes aislados sin depender de sus dependencias reales. En este tema, aprenderás a usar Mockito para simular dependencias y escribir pruebas unitarias efectivas en Spring Boot.
Conceptos Clave
- Simulación (Mocking): Crear objetos simulados que imitan el comportamiento de objetos reales.
- Stubbing: Definir el comportamiento de los métodos de los objetos simulados.
- Verificación: Comprobar que los métodos de los objetos simulados se llamaron con los parámetros esperados.
Configuración de Mockito
Para usar Mockito en tu proyecto Spring Boot, necesitas agregar la dependencia de Mockito en tu archivo pom.xml
:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.11.2</version> <scope>test</scope> </dependency>
Creando un Test con Mockito
Paso 1: Crear una Clase de Servicio
Supongamos que tienes una clase de servicio UserService
que depende de un repositorio UserRepository
:
@Service public class UserService { @Autowired private UserRepository userRepository; public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } }
Paso 2: Crear una Clase de Prueba
Crea una clase de prueba para UserService
y usa Mockito para simular UserRepository
:
@RunWith(MockitoJUnitRunner.class) public class UserServiceTest { @InjectMocks private UserService userService; @Mock private UserRepository userRepository; @Test public void testGetUserById() { // Crear un objeto User simulado User mockUser = new User(); mockUser.setId(1L); mockUser.setName("John Doe"); // Definir el comportamiento del método findById del repositorio simulado Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser)); // Llamar al método del servicio User user = userService.getUserById(1L); // Verificar el resultado assertNotNull(user); assertEquals("John Doe", user.getName()); // Verificar que el método findById del repositorio se llamó con el parámetro correcto Mockito.verify(userRepository).findById(1L); } }
Explicación del Código
-
Anotaciones:
@RunWith(MockitoJUnitRunner.class)
: Configura el entorno de prueba para usar Mockito.@InjectMocks
: Inyecta los mocks en la instancia deUserService
.@Mock
: Crea un mock deUserRepository
.
-
Stubbing:
Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));
: Define el comportamiento del métodofindById
del repositorio simulado.
-
Verificación:
Mockito.verify(userRepository).findById(1L);
: Verifica que el métodofindById
del repositorio se llamó con el parámetro1L
.
Ejercicio Práctico
Ejercicio 1: Simulación de Dependencias
- Crea una clase
OrderService
que dependa deOrderRepository
. - Implementa un método
getOrderById(Long id)
enOrderService
. - Crea una clase de prueba
OrderServiceTest
y usa Mockito para simularOrderRepository
. - Escribe una prueba unitaria para
getOrderById(Long id)
.
Solución
Clase OrderService
@Service public class OrderService { @Autowired private OrderRepository orderRepository; public Order getOrderById(Long id) { return orderRepository.findById(id).orElse(null); } }
Clase de Prueba OrderServiceTest
@RunWith(MockitoJUnitRunner.class) public class OrderServiceTest { @InjectMocks private OrderService orderService; @Mock private OrderRepository orderRepository; @Test public void testGetOrderById() { // Crear un objeto Order simulado Order mockOrder = new Order(); mockOrder.setId(1L); mockOrder.setDescription("Sample Order"); // Definir el comportamiento del método findById del repositorio simulado Mockito.when(orderRepository.findById(1L)).thenReturn(Optional.of(mockOrder)); // Llamar al método del servicio Order order = orderService.getOrderById(1L); // Verificar el resultado assertNotNull(order); assertEquals("Sample Order", order.getDescription()); // Verificar que el método findById del repositorio se llamó con el parámetro correcto Mockito.verify(orderRepository).findById(1L); } }
Conclusión
En esta sección, aprendiste a usar Mockito para simular dependencias en tus pruebas unitarias. La simulación te permite probar componentes de manera aislada, asegurando que las pruebas sean más rápidas y confiables. Practica estos conceptos creando y probando más servicios en tu aplicación Spring Boot.
En el siguiente módulo, exploraremos cómo realizar pruebas de integración para asegurar que los diferentes componentes de tu aplicación funcionen correctamente juntos.
Curso de Spring Boot
Módulo 1: Introducción a Spring Boot
- ¿Qué es Spring Boot?
- Configuración de tu Entorno de Desarrollo
- Creando tu Primera Aplicación Spring Boot
- Entendiendo la Estructura del Proyecto Spring Boot
Módulo 2: Conceptos Básicos de Spring Boot
- Anotaciones de Spring Boot
- Inyección de Dependencias en Spring Boot
- Configuración de Spring Boot
- Propiedades de Spring Boot
Módulo 3: Construyendo Servicios Web RESTful
- Introducción a los Servicios Web RESTful
- Creando Controladores REST
- Manejo de Métodos HTTP
- Manejo de Excepciones en REST
Módulo 4: Acceso a Datos con Spring Boot
- Introducción a Spring Data JPA
- Configuración de Fuentes de Datos
- Creación de Entidades JPA
- Uso de Repositorios de Spring Data
- Métodos de Consulta en Spring Data JPA
Módulo 5: Seguridad en Spring Boot
- Introducción a Spring Security
- Configuración de Spring Security
- Autenticación y Autorización de Usuarios
- Implementación de Autenticación JWT
Módulo 6: Pruebas en Spring Boot
- Introducción a las Pruebas
- Pruebas Unitarias con JUnit
- Pruebas de Integración
- Simulación con Mockito
Módulo 7: Funciones Avanzadas de Spring Boot
Módulo 8: Despliegue de Aplicaciones Spring Boot
Módulo 9: Rendimiento y Monitoreo
- Ajuste de Rendimiento
- Monitoreo con Spring Boot Actuator
- Uso de Prometheus y Grafana
- Gestión de Registros y Logs