Curso de Spring Boot
En desarrollo profesional es muy importante probar el código automáticamente.
Esto se hace mediante tests.
Los tests permiten:
- detectar errores
- asegurar que el código funciona
- evitar que cambios rompan el sistema
- mejorar la calidad del software
Spring Boot incluye soporte para testing usando herramientas como:
- JUnit
- Mockito
- Spring Test
12.1 Tipos de tests
En una aplicación Spring Boot existen varios tipos de pruebas.
| tipo | objetivo |
|---|---|
| Test unitario | probar una clase aislada |
| Test de servicio | probar lógica de negocio |
| Test de repositorio | probar acceso a base de datos |
| Test de controller | probar endpoints |
| Test de integración | probar varias capas juntas |
12.2 Dependencia de testing
Spring Boot incluye testing por defecto.
En pom.xml aparece:
1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-test</artifactId> 4 <scope>test</scope> 5</dependency>
Esto incluye:
- JUnit
- Mockito
- Spring Test
12.3 Estructura de tests
Los tests están en:
1src/test/java
Ejemplo:
1src/test/java/com/example/app 2 3UserServiceTest.java 4UserControllerTest.java
12.4 Test unitario simple
Ejemplo de test básico con JUnit.
Clase a probar:
1public class CalculatorService { 2 3 public int sum(int a, int b) { 4 return a + b; 5 } 6 7}
Test
1import org.junit.jupiter.api.Test; 2import static org.junit.jupiter.api.Assertions.*; 3 4class CalculatorServiceTest { 5 6 @Test 7 void sumShouldReturnCorrectResult() { 8 9 CalculatorService service = new CalculatorService(); 10 11 int result = service.sum(2, 3); 12 13 assertEquals(5, result); 14 15 } 16 17}
Explicación
| método | función |
|---|---|
@Test | indica un test |
assertEquals | verifica resultado |
12.5 Testing de servicios con Mockito
Muchas veces el servicio depende de un repository.
Ejemplo:
1@Service 2public class UserService { 3 4 private final UserRepository repository; 5 6 public UserService(UserRepository repository) { 7 this.repository = repository; 8 } 9 10 public List<User> getUsers() { 11 return repository.findAll(); 12 } 13 14}
Problema
No queremos usar una base de datos real en el test.
Por eso usamos Mockito.
Mockito crea objetos simulados (mocks).
12.6 Test con Mockito
1import org.junit.jupiter.api.Test; 2import static org.mockito.Mockito.*; 3import static org.junit.jupiter.api.Assertions.*; 4 5class UserServiceTest { 6 7 @Test 8 void shouldReturnUsers() { 9 10 UserRepository repository = mock(UserRepository.class); 11 12 when(repository.findAll()) 13 .thenReturn(List.of(new User("Ana"))); 14 15 UserService service = new UserService(repository); 16 17 List<User> users = service.getUsers(); 18 19 assertEquals(1, users.size()); 20 21 } 22 23}
Explicación
| método | función |
|---|---|
| mock() | crea objeto falso |
| when() | define comportamiento |
| thenReturn() | define resultado |
12.7 Testing de Controllers
Para probar controllers usamos MockMvc.
Esto permite simular peticiones HTTP.
Ejemplo controller
1@RestController 2@RequestMapping("/hello") 3public class HelloController { 4 5 @GetMapping 6 public String hello() { 7 return "Hola mundo"; 8 } 9 10}
Test
1@SpringBootTest 2@AutoConfigureMockMvc 3class HelloControllerTest { 4 5 @Autowired 6 private MockMvc mockMvc; 7 8 @Test 9 void shouldReturnHello() throws Exception { 10 11 mockMvc.perform(get("/hello")) 12 .andExpect(status().isOk()) 13 .andExpect(content().string("Hola mundo")); 14 15 } 16 17}
Explicación
| método | función |
|---|---|
MockMvc | simula peticiones HTTP |
perform() | ejecuta petición |
andExpect() | verifica respuesta |
12.8 Testing de repositorios
Para probar repositorios usamos:
1@DataJpaTest
Esto inicia solo la capa de base de datos.
Ejemplo
1@DataJpaTest 2class UserRepositoryTest { 3 4 @Autowired 5 private UserRepository repository; 6 7 @Test 8 void shouldSaveUser() { 9 10 User user = new User(); 11 user.setName("Ana"); 12 13 User saved = repository.save(user); 14 15 assertNotNull(saved.getId()); 16 17 } 18 19}
12.9 Testing de integración
Un test de integración prueba varias capas juntas.
Ejemplo:
1Controller + Service + Repository
Ejemplo
1@SpringBootTest 2class UserIntegrationTest { 3 4 @Autowired 5 private UserService service; 6 7 @Test 8 void shouldCreateUser() { 9 10 User user = new User(); 11 user.setName("Ana"); 12 13 User saved = service.createUser(user); 14 15 assertNotNull(saved.getId()); 16 17 } 18 19}
12.10 Buenas prácticas en testing
Testear lógica de negocio
La lógica en services debe tener tests.
No usar base de datos real en tests unitarios
Usar Mockito.
Nombres claros en tests
Ejemplo:
1shouldCreateUser 2shouldReturnUsers 3shouldThrowException
Un test → un comportamiento
Cada test debe comprobar una sola cosa.
12.11 Estructura típica de tests
1src/test/java 2 3controller 4service 5repository 6integration
- Loading...