Spring Boot

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ícate

Testing 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.

Aprende SpringBoot online

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

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Crear Proyecto Con Spring Initializr

Spring Boot

Introducción Y Entorno

Crear Proyecto Desde Visual Studio Code

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Controladores Spring Rest

Spring Boot

Spring Mvc Con Thymeleaf

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Mvc Con Thymeleaf

Servicios En Spring

Spring Boot

Spring Mvc Con Thymeleaf

Clientes Resttemplate Y Restclient

Spring Boot

Spring Mvc Con Thymeleaf

Rxjava En Spring Web

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Post En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Métodos Get En Controladores Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Formularios En Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Crear Proyecto Con Intellij Idea

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Los Modelos Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Layouts Y Fragmentos En Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Bootstrap Css

Spring Boot

Spring Mvc Con Thymeleaf

Gestión De Errores Controlleradvice

Spring Boot

Spring Mvc Con Thymeleaf

Estilización Con Tailwind Css

Spring Boot

Spring Mvc Con Thymeleaf

Introducción A Controladores Rest

Spring Boot

Spring Rest

Métodos Get En Controladores Rest

Spring Boot

Spring Rest

Métodos Post En Controladores Rest

Spring Boot

Spring Rest

Métodos Delete En Controladores Rest

Spring Boot

Spring Rest

Métodos Put Y Patch En Controladores Rest

Spring Boot

Spring Rest

Gestión De Errores Restcontrolleradvice

Spring Boot

Spring Rest

Creación De Entidades Jpa

Spring Boot

Spring Data Jpa

Asociaciones De Entidades Jpa

Spring Boot

Spring Data Jpa

Repositorios Spring Data

Spring Boot

Spring Data Jpa

Métodos Find En Repositorios

Spring Boot

Spring Data Jpa

Inserción De Datos

Spring Boot

Spring Data Jpa

Actualizar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Borrar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Spring Data Jpa

Api Query By Example (Qbe)

Spring Boot

Spring Data Jpa

Api Specification

Spring Boot

Spring Data Jpa

Repositorios Reactivos

Spring Boot

Spring Data Jpa

Configuración Base De Datos Postgresql

Spring Boot

Spring Data Jpa

Configuración Base De Datos Mysql

Spring Boot

Spring Data Jpa

Introducción A Jpa Y Spring Data Jpa

Spring Boot

Spring Data Jpa

Configuración Base De Datos H2

Spring Boot

Spring Data Jpa

Testing Unitario De Componentes Y Servicios

Spring Boot

Testing Con Spring Test

Testing De Repositorios Spring Data Jpa

Spring Boot

Testing Con Spring Test

Testing Controladores Spring Mvc Con Thymeleaf

Spring Boot

Testing Con Spring Test

Testing Controladores Rest Con Json

Spring Boot

Testing Con Spring Test

Testing De Aplicaciones Reactivas Webflux

Spring Boot

Testing Con Spring Test

Testing De Seguridad Spring Security

Spring Boot

Testing Con Spring Test

Testing Con Apache Kafka

Spring Boot

Testing Con Spring Test

Introducción Al Testing

Spring Boot

Testing Con Spring Test

Introducción A Spring Security

Spring Boot

Seguridad Con Spring Security

Seguridad Basada En Formulario

Spring Boot

Seguridad Con Spring Security

Registro De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Login De Usuarios En Api Rest

Spring Boot

Seguridad Con Spring Security

Validación Jwt En Api Rest

Spring Boot

Seguridad Con Spring Security

Autenticación Jwt Completa En Api Rest

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Reactiva Spring Webflux

Spring Boot

Seguridad Con Spring Security

Autenticación Y Autorización Con Anotaciones

Spring Boot

Seguridad Con Spring Security

Fundamentos De Autenticación Oauth

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth Con Github

Spring Boot

Seguridad Con Spring Security

Testing Con Spring Security Test

Spring Boot

Seguridad Con Spring Security

Autenticación Oauth En Api Rest

Spring Boot

Seguridad Con Spring Security

Introducción A Spring Webflux

Spring Boot

Reactividad Webflux

Spring Data R2dbc

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Anotaciones

Spring Boot

Reactividad Webflux

Controlador Reactivo Basado En Funciones

Spring Boot

Reactividad Webflux

Operadores Reactivos Básicos

Spring Boot

Reactividad Webflux

Operadores Reactivos Avanzados

Spring Boot

Reactividad Webflux

Cliente Reactivo Webclient

Spring Boot

Reactividad Webflux

Introducción E Instalación De Apache Kafka

Spring Boot

Mensajería Asíncrona

Crear Proyecto Con Apache Kafka

Spring Boot

Mensajería Asíncrona

Creación De Producers

Spring Boot

Mensajería Asíncrona

Creación De Consumers

Spring Boot

Mensajería Asíncrona

Kafka Streams En Spring Boot

Spring Boot

Mensajería Asíncrona

Integración Con Angular

Spring Boot

Integración Frontend

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Accede GRATIS a SpringBoot y certifícate

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.

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.