SpringBoot
Tutorial SpringBoot: Introducción al testing
Aprende testing unitario e integración en Spring Boot usando JUnit 5 y Mockito para mejorar la calidad y fiabilidad de tus aplicaciones.
Aprende SpringBoot y certifícateTesting unitario con JUnit 5 y Mockito
El testing unitario constituye la base fundamental de cualquier estrategia de testing en aplicaciones Spring Boot. Se centra en verificar el comportamiento de componentes individuales de forma aislada, sin depender de sistemas externos como bases de datos, servicios web o el contexto completo de Spring.
En el ecosistema Spring Boot, JUnit 5 actúa como el framework principal para escribir y ejecutar tests unitarios. Esta versión moderna de JUnit introduce una arquitectura modular y características avanzadas que simplifican significativamente la creación de tests. Junto a JUnit 5, Mockito se presenta como la herramienta estándar para crear objetos simulados (mocks) que reemplazan las dependencias reales durante las pruebas.
¿Qué son los tests unitarios?
Los tests unitarios verifican el funcionamiento correcto de una unidad específica de código, típicamente un método o una clase, de manera completamente aislada. En Spring Boot, esto significa probar servicios, controladores, repositorios y otros componentes sin inicializar el contexto completo del framework.
La filosofía del testing unitario se basa en tres principios fundamentales:
- Aislamiento: Cada test debe ejecutarse independientemente sin afectar a otros tests
- Rapidez: Los tests unitarios deben ejecutarse en milisegundos, no en segundos
- Determinismo: Un test debe producir siempre el mismo resultado bajo las mismas condiciones
JUnit 5: El framework de testing moderno
JUnit 5 representa una evolución completa respecto a versiones anteriores, ofreciendo una arquitectura basada en tres subproyectos: JUnit Platform, JUnit Jupiter y JUnit Vintage. Para desarrolladores de Spring Boot, JUnit Jupiter es el componente más relevante, ya que proporciona el modelo de programación y las anotaciones para escribir tests.
Las anotaciones principales de JUnit 5 incluyen:
- @Test: Marca un método como test unitario
- @BeforeEach: Ejecuta código antes de cada test individual
- @AfterEach: Ejecuta código después de cada test individual
- @BeforeAll: Ejecuta código una vez antes de todos los tests de la clase
- @AfterAll: Ejecuta código una vez después de todos los tests de la clase
Spring Boot incluye automáticamente JUnit 5 cuando agregamos el starter spring-boot-starter-test
, eliminando la necesidad de configuración manual de dependencias.
Mockito: Simulación de dependencias
Mockito resuelve uno de los desafíos más importantes del testing unitario: cómo probar un componente que depende de otros componentes sin involucrar esas dependencias reales. Un mock es un objeto simulado que imita el comportamiento de una dependencia real, pero de forma controlada y predecible.
En aplicaciones Spring Boot, Mockito resulta especialmente útil para:
- Simular servicios que realizan operaciones complejas o costosas
- Reemplazar repositorios que accederían a bases de datos
- Mockear clientes HTTP que consumirían APIs externas
- Controlar respuestas de componentes para probar diferentes escenarios
Integración con Spring Boot
Spring Boot facilita enormemente el uso de JUnit 5 y Mockito mediante anotaciones específicas que simplifican la configuración de tests:
- @MockBean: Crea un mock de un bean de Spring y lo registra en el contexto de aplicación
- @SpyBean: Crea un spy (espía) de un bean existente, permitiendo verificar llamadas reales
- @TestConfiguration: Define configuración específica para tests
La estrategia recomendada para testing unitario en Spring Boot consiste en usar mocks para todas las dependencias externas, manteniendo el test enfocado únicamente en la lógica del componente bajo prueba.
Ventajas del testing unitario
El testing unitario efectivo proporciona múltiples beneficios en el desarrollo con Spring Boot:
- Detección temprana de errores: Los bugs se identifican durante el desarrollo, no en producción
- Documentación viva: Los tests actúan como especificaciones ejecutables del comportamiento esperado
- Refactoring seguro: Permiten modificar código con confianza, sabiendo que la funcionalidad se mantiene
- Desarrollo más rápido: Aunque inicialmente requiere más tiempo, acelera el desarrollo a largo plazo
Casos de uso típicos
En aplicaciones Spring Boot, los casos de uso más comunes para testing unitario incluyen:
- Testing de servicios: Verificar lógica de negocio sin acceder a bases de datos
- Testing de controladores: Probar mapeo de endpoints y manejo de parámetros
- Testing de componentes: Validar comportamiento de beans personalizados
- Testing de utilidades: Verificar métodos auxiliares y transformaciones de datos
El enfoque gradual consiste en comenzar con tests simples que verifiquen la funcionalidad básica, para posteriormente agregar tests más complejos que cubran casos edge y escenarios de error.
Testing de integración con Spring Test
El testing de integración representa el siguiente nivel en la pirámide de testing, enfocándose en verificar que múltiples componentes de la aplicación funcionen correctamente cuando trabajan juntos. A diferencia del testing unitario, que aísla componentes individuales, el testing de integración evalúa las interacciones reales entre diferentes capas de la aplicación Spring Boot.
Spring Test proporciona un conjunto completo de herramientas y anotaciones diseñadas específicamente para facilitar el testing de integración en aplicaciones Spring Boot. Este framework permite cargar contextos de aplicación reales, configurar bases de datos de prueba y simular peticiones HTTP de forma controlada.
¿Qué es el testing de integración?
El testing de integración verifica que los componentes de la aplicación se comuniquen correctamente entre sí y con sistemas externos como bases de datos, caches o servicios web. En el contexto de Spring Boot, esto significa probar la integración completa desde el controlador hasta la base de datos, pasando por servicios y repositorios.
Los objetivos principales del testing de integración incluyen:
- Verificar la configuración: Asegurar que los beans se inyectan correctamente
- Probar flujos completos: Validar operaciones end-to-end a través de múltiples capas
- Detectar problemas de integración: Identificar errores que solo aparecen cuando los componentes interactúan
- Validar configuración de base de datos: Confirmar que las entidades JPA y repositorios funcionan correctamente
Tipos de testing de integración en Spring Boot
Spring Boot ofrece diferentes niveles de testing de integración, cada uno con un propósito específico:
Testing de capa web se centra en probar controladores junto con la infraestructura web de Spring MVC, incluyendo serialización JSON, validación de parámetros y manejo de errores. Este tipo de test carga únicamente los componentes necesarios para la capa web.
Testing de capa de datos verifica la interacción con la base de datos, incluyendo repositorios JPA, consultas personalizadas y transacciones. Estos tests utilizan bases de datos en memoria para mantener la velocidad de ejecución.
Testing de contexto completo carga toda la aplicación Spring Boot, incluyendo todas las capas y configuraciones. Aunque son más lentos, proporcionan la validación más completa del comportamiento de la aplicación.
Anotaciones clave de Spring Test
Spring Test introduce anotaciones específicas que simplifican la configuración de tests de integración:
@SpringBootTest constituye la anotación principal para tests de integración completos. Carga el contexto completo de la aplicación Spring Boot, incluyendo todos los beans, configuraciones y propiedades. Esta anotación permite especificar diferentes modos de ejecución según las necesidades del test.
@WebMvcTest se especializa en testing de la capa web, cargando únicamente los componentes relacionados con Spring MVC como controladores, filtros y configuración web. Excluye automáticamente otros componentes como servicios y repositorios, que deben ser mockeados si son necesarios.
@DataJpaTest está diseñada específicamente para testing de la capa de persistencia. Configura automáticamente una base de datos en memoria, escanea entidades JPA y proporciona un TestEntityManager para operaciones de base de datos en tests.
Configuración de entorno de testing
El entorno de testing de integración requiere configuración específica para garantizar que los tests sean reproducibles y aislados. Spring Boot facilita esta configuración mediante perfiles de testing y propiedades específicas.
Los perfiles de testing permiten definir configuraciones diferentes para el entorno de pruebas. Típicamente se utiliza el perfil test
que puede incluir configuraciones como bases de datos en memoria, niveles de logging específicos y deshabilitación de características no necesarias durante testing.
La configuración de base de datos para testing generalmente utiliza H2 o otra base de datos en memoria que se inicializa automáticamente para cada test. Esto garantiza que los tests no interfieran entre sí y que cada uno comience con un estado limpio de datos.
Ventajas del testing de integración
El testing de integración efectivo aporta beneficios únicos que complementan el testing unitario:
- Validación de configuración real: Detecta errores de configuración que no aparecen en tests unitarios
- Verificación de flujos completos: Asegura que los procesos de negocio funcionan de principio a fin
- Detección de problemas de rendimiento: Identifica consultas lentas o problemas de N+1 en bases de datos
- Confianza en despliegues: Proporciona mayor seguridad al realizar cambios en producción
Estrategia de testing balanceada
Una estrategia de testing efectiva combina testing unitario y de integración de forma equilibrada. La regla general sugiere tener muchos tests unitarios rápidos, algunos tests de integración de componentes específicos y pocos tests de integración completos.
Los tests de integración deben enfocarse en escenarios que no pueden validarse mediante testing unitario, como la correcta configuración de transacciones, el comportamiento de consultas complejas o la integración con sistemas externos.
La ejecución de tests de integración típicamente forma parte de pipelines de CI/CD, ejecutándose antes de despliegues para garantizar que los cambios no rompan la funcionalidad existente de la aplicación.
Otras lecciones de SpringBoot
Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Spring Boot
Introducción Y Entorno
Spring Boot Starters
Introducción Y Entorno
Inyección De Dependencias
Introducción Y Entorno
Crear Proyecto Con Spring Initializr
Introducción Y Entorno
Crear Proyecto Desde Visual Studio Code
Introducción Y Entorno
Controladores Spring Mvc
Spring Mvc Con Thymeleaf
Vista En Spring Mvc Con Thymeleaf
Spring Mvc Con Thymeleaf
Controladores Spring Rest
Spring Mvc Con Thymeleaf
Open Api Y Cómo Agregarlo En Spring Boot
Spring Mvc Con Thymeleaf
Servicios En Spring
Spring Mvc Con Thymeleaf
Clientes Resttemplate Y Restclient
Spring Mvc Con Thymeleaf
Rxjava En Spring Web
Spring Mvc Con Thymeleaf
Métodos Post En Controladores Mvc
Spring Mvc Con Thymeleaf
Métodos Get En Controladores Mvc
Spring Mvc Con Thymeleaf
Formularios En Spring Mvc
Spring Mvc Con Thymeleaf
Crear Proyecto Con Intellij Idea
Spring Mvc Con Thymeleaf
Introducción A Los Modelos Mvc
Spring Mvc Con Thymeleaf
Layouts Y Fragmentos En Thymeleaf
Spring Mvc Con Thymeleaf
Estilización Con Bootstrap Css
Spring Mvc Con Thymeleaf
Gestión De Errores Controlleradvice
Spring Mvc Con Thymeleaf
Estilización Con Tailwind Css
Spring Mvc Con Thymeleaf
Introducción A Controladores Rest
Spring Rest
Métodos Get En Controladores Rest
Spring Rest
Métodos Post En Controladores Rest
Spring Rest
Métodos Delete En Controladores Rest
Spring Rest
Métodos Put Y Patch En Controladores Rest
Spring Rest
Gestión De Errores Restcontrolleradvice
Spring Rest
Creación De Entidades Jpa
Spring Data Jpa
Asociaciones De Entidades Jpa
Spring Data Jpa
Repositorios Spring Data
Spring Data Jpa
Métodos Find En Repositorios
Spring Data Jpa
Inserción De Datos
Spring Data Jpa
Actualizar Datos De Base De Datos
Spring Data Jpa
Borrar Datos De Base De Datos
Spring Data Jpa
Consultas Jpql Con @Query En Spring Data Jpa
Spring Data Jpa
Api Query By Example (Qbe)
Spring Data Jpa
Api Specification
Spring Data Jpa
Repositorios Reactivos
Spring Data Jpa
Configuración Base De Datos Postgresql
Spring Data Jpa
Configuración Base De Datos Mysql
Spring Data Jpa
Introducción A Jpa Y Spring Data Jpa
Spring Data Jpa
Configuración Base De Datos H2
Spring Data Jpa
Testing Unitario De Componentes Y Servicios
Testing Con Spring Test
Testing De Repositorios Spring Data Jpa
Testing Con Spring Test
Testing Controladores Spring Mvc Con Thymeleaf
Testing Con Spring Test
Testing Controladores Rest Con Json
Testing Con Spring Test
Testing De Aplicaciones Reactivas Webflux
Testing Con Spring Test
Testing De Seguridad Spring Security
Testing Con Spring Test
Testing Con Apache Kafka
Testing Con Spring Test
Introducción Al Testing
Testing Con Spring Test
Introducción A Spring Security
Seguridad Con Spring Security
Seguridad Basada En Formulario
Seguridad Con Spring Security
Registro De Usuarios En Api Rest
Seguridad Con Spring Security
Login De Usuarios En Api Rest
Seguridad Con Spring Security
Validación Jwt En Api Rest
Seguridad Con Spring Security
Autenticación Jwt Completa En Api Rest
Seguridad Con Spring Security
Seguridad Jwt En Api Rest Reactiva Spring Webflux
Seguridad Con Spring Security
Autenticación Y Autorización Con Anotaciones
Seguridad Con Spring Security
Fundamentos De Autenticación Oauth
Seguridad Con Spring Security
Autenticación Oauth Con Github
Seguridad Con Spring Security
Testing Con Spring Security Test
Seguridad Con Spring Security
Autenticación Oauth En Api Rest
Seguridad Con Spring Security
Introducción A Spring Webflux
Reactividad Webflux
Spring Data R2dbc
Reactividad Webflux
Controlador Reactivo Basado En Anotaciones
Reactividad Webflux
Controlador Reactivo Basado En Funciones
Reactividad Webflux
Operadores Reactivos Básicos
Reactividad Webflux
Operadores Reactivos Avanzados
Reactividad Webflux
Cliente Reactivo Webclient
Reactividad Webflux
Introducción E Instalación De Apache Kafka
Mensajería Asíncrona
Crear Proyecto Con Apache Kafka
Mensajería Asíncrona
Creación De Producers
Mensajería Asíncrona
Creación De Consumers
Mensajería Asíncrona
Kafka Streams En Spring Boot
Mensajería Asíncrona
Integración Con Angular
Integración Frontend
Integración Con React
Integración Frontend
Integración Con Vue
Integración Frontend
Ejercicios de programación de SpringBoot
Evalúa tus conocimientos de esta lección Introducción al testing con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Crear entidades JPA
Controladores Spring MVC
Asociaciones de entidades JPA
Creación de entidades
Reto servicio PedidoService
Reto controlador REST
Consultas JPQL
Reto test controlador REST
Anotaciones JPA
Relación ManyToOne con Tarea y Proyecto
CRUD Customers Spring MVC + Spring Data JPA
Backend API REST con Spring Boot
Filtrar categorías por nombre
Reto controlador MVC Categoría
Entidad y repositorio
Métodos derivados y consultas JPQL en repositorios
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender los fundamentos y principios del testing unitario en Spring Boot.
- Aprender a utilizar JUnit 5 para escribir y ejecutar tests unitarios.
- Conocer el uso de Mockito para simular dependencias en tests unitarios.
- Entender el propósito y tipos de testing de integración en Spring Boot.
- Familiarizarse con las anotaciones y configuraciones clave para testing en Spring Boot.