¿Qué hace spring-boot-test-patterns?
Proporciona patrones de prueba completos para aplicaciones Spring Boot que cubren pruebas unitarias, de integración, por capas y basadas en contenedores con JUnit 5, Mockito, Testcontainers y optimización del rendimiento. Útil al escribir pruebas, métodos @Test, mocks @MockBean o implementar suites de prueba para aplicaciones Spring Boot.
Patrones Cubiertos
1. Pruebas Unitarias
- Uso de JUnit 5 y Mockito para aislar la lógica de negocio.
- Configuración de mocks con
@Mocky@InjectMocks. - Verificación de interacciones con
verify().
2. Pruebas de Integración
- Arranque completo del contexto de Spring con
@SpringBootTest. - Configuración de perfiles específicos con
@ActiveProfiles. - Pruebas con bases de datos en memoria (H2) y reales (PostgreSQL, MySQL).
3. Pruebas por Capas (Slice Tests)
@WebMvcTest: Pruebas de la capa web.@DataJpaTest: Pruebas de la capa de persistencia.@JsonTest: Pruebas de serialización/deserialización JSON.@RestClientTest: Pruebas de clientes REST.
4. Pruebas Basadas en Contenedores
- Uso de Testcontainers para gestionar dependencias externas.
- Ejemplos con bases de datos, colas de mensajes y servicios cloud.
- Configuración de contenedores reutilizables para acelerar las pruebas.
5. Optimización del Rendimiento
- Uso de
@SpringBootTest(webEnvironment = WebEnvironment.NONE)para pruebas rápidas. - Configuración de beans perezosos con
@Lazy. - Agrupación de pruebas en suites usando
@Suitede JUnit 5. - Uso de
@DynamicPropertySourcepara configuración dinámica.
Ejemplos de Código
Prueba Unitaria con Mockito
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void findById_ShouldReturnUser() {
User user = new User(1L, "John");
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
User result = userService.findById(1L);
assertThat(result).isNotNull();
assertThat(result.getName()).isEqualTo("John");
verify(userRepository).findById(1L);
}
}
Prueba de Integración con Testcontainers
@SpringBootTest
@Testcontainers
class UserRepositoryIntegrationTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Autowired
private UserRepository userRepository;
@Test
void save_ShouldPersistUser() {
User user = new User();
user.setName("Alice");
User savedUser = userRepository.save(user);
assertThat(savedUser.getId()).isNotNull();
}
}
Prueba por Capas con @WebMvcTest
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void getUser_ShouldReturnUser() throws Exception {
User user = new User(1L, "Bob");
when(userService.findById(1L)).thenReturn(user);
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Bob"));
verify(userService).findById(1L);
}
}
Buenas Prácticas
- Nombrar los métodos de prueba descriptivamente (ej:
shouldReturnUserWhenIdExists). - Usar
@BeforeEachpara configurar datos comunes. - Evitar el uso de
@SpringBootTestcuando no sea necesario; preferir slices. - Utilizar contenedores reutilizables para reducir el tiempo de inicialización.
- Mantener las pruebas independientes y sin dependencias de orden.
Herramientas Soportadas
- JUnit 5 (Jupiter API)
- Mockito 5.x
- Testcontainers
- Spring Boot Test (incluyendo MockMvc y WebTestClient)
- AssertJ para aserciones fluidas
Configuración de Dependencias (Maven)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
Configuración de Dependencias (Gradle)
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testcontainers:testcontainers:1.19.3'
testImplementation 'org.testcontainers:postgresql:1.19.3'
Enlaces Útiles
- Documentación de Spring Boot Testing
- Guía de JUnit 5
- Documentación de Mockito
- Testcontainers para Java
Este skill está diseñado para ser utilizado con asistentes de código como Claude Code, Cursor, Codex y otros, para generar y analizar pruebas en proyectos Spring Boot de manera consistente y eficiente.