SpringBoot: Reto Testing de RestController

Código
Intermedio
SpringBoot
Curso de SpringBoot
30 min
200 XP
Actualizado: 09/10/2025

Ejercicio de programación: Reto Testing de RestController

Este ejercicio de programación está diseñado para poner a prueba tus conocimientos en SpringBoot. Es un ejercicio de nivel intermedio que requiere conocimientos sólidos de la tecnología.

Tipo: Ejercicio de código 30 minutos estimados 200 puntos de experiencia

Información adicional del ejercicio

Crear un test de controlador REST que valide respuestas JSON usando MockMvc y verificaciones con jsonPath.

Contenido del ejercicio

Crea el código de test para un controlador REST que gestiona productos. 

El controlador tiene un endpoint GET /api/productos/1 que devuelve un producto en formato JSON con los campos id, nombre y precio.

Debes implementar:

  1. El código d una clase de test anotada con @WebMvcTest que especifique el controlador ProductoController
  2. Inyectar MockMvc usando @Autowired
  3. Crear un mock del servicio ProductoService usando @MockBean
  4. Implementar un método de test que:
  • Configure el mock para que obtenerProductoPorId(1L) devuelva un producto con id=1, nombre="Laptop" y precio=999.99
  • Realice una petición GET a /api/productos/1 aceptando JSON
  • Verifique que el status sea 200 OK
  • Verifique que el content-type sea JSON
  • Use jsonPath para validar que el campo nombre sea "Laptop"
  • Use jsonPath para validar que el campo precio sea 999.99

Empezar creando la clase de test con las anotaciones necesarias, luego inyectar las dependencias y finalmente implementar el método de test con todas las verificaciones usando mockMvc.perform() y andExpect().

Este es el código que debes testear:

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

class User {
    private Long id;
    private String name;
    private String email;

    public User() {}

    public User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // getters y setters
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}


@RestController
class UserController {

    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        // Usuario hardcodeado como se especifica en el enunciado
        User user = new User(1L, "Juan Pérez", "juan@email.com");
        return ResponseEntity.ok(user);
    }
}


class Producto {
    private Long id;
    private String nombre;
    private Double precio;

    public Producto() {}

    public Producto(Long id, String nombre, Double precio) {
        this.id = id;
        this.nombre = nombre;
        this.precio = precio;
    }

    // getters y setters
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getNombre() { return nombre; }
    public void setNombre(String nombre) { this.nombre = nombre; }

    public Double getPrecio() { return precio; }
    public void setPrecio(Double precio) { this.precio = precio; }
}

// Servicio ProductoService (interfaz)
interface ProductoService {
    Producto obtenerProductoPorId(Long id);
}

// Implementación dummy (no usada por el test, pero incluida para completitud)
@Service
class ProductoServiceImpl implements ProductoService {
    @Override
    public Producto obtenerProductoPorId(Long id) {
        // implementación trivial — en la app real buscaría en BD
        return new Producto(id, "Producto ejemplo", 0.0);
    }
}


@RestController
class ProductoController {

    private final ProductoService productoService;

    public ProductoController(ProductoService productoService) {
        this.productoService = productoService;
    }

    @GetMapping("/api/productos/{id}")
    public ResponseEntity<Producto> obtenerProducto(@PathVariable Long id) {
        Producto p = productoService.obtenerProductoPorId(id);
        return ResponseEntity.ok(p);
    }
}

Lección relacionada

Este ejercicio está relacionado con la lección "Testing controladores REST con json" de SpringBoot. Te recomendamos revisar la lección antes de comenzar.

Ver lección relacionada

Más ejercicios de SpringBoot

Explora más ejercicios de programación en SpringBoot para mejorar tus habilidades y obtener tu certificación.

Ver más ejercicios de SpringBoot

Cursos que incluyen este ejercicio

Este ejercicio forma parte de los siguientes cursos estructurados con rutas de aprendizaje

Alan Sastre - Autor del ejercicio

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, SpringBoot es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear ejercicios prácticos y contenido educativo de calidad para desarrolladores de todos los niveles.

Solución al ejercicio de programación en SpringBoot

Contenido bloqueado

¡Desbloquea la solución completa!

Completa el ejercicio de programación en SpringBoot para acceder a la solución paso a paso, explicaciones detalladas y mejores prácticas.

solution.js
JavaScript
1 function solveChallenge ( input ) {
2 // Algoritmo optimizado O(n log n)
3 const data = parseInput ( input );
4 const sorted = data . sort (( a , b ) => a - b );
5
6 // Aplicar técnica de dos punteros
7 let left = 0 , right = sorted . length - 1 ;
8 const result = [];
9
10 while ( left < right ) {
11 const sum = sorted [ left ] + sorted [ right ];
12 if ( sum === target ) {
13 result . push ([ sorted [ left ], sorted [ right ]]);
14 left ++; right --;
15 } else if ( sum < target ) {
16 left ++;
17 } else {
18 right --;
19 }
20 }
21
22 return result ;
23 }
Código completo
Explicaciones
Mejores prácticas
+1.200 developers han resuelto este ejercicio de programación

Practica con ejercicios de programación en SpringBoot

Mejora tus habilidades con cientos de ejercicios de práctica, recibe retroalimentación instantánea y obtén tu certificación cuando estés listo.

Asistente de IA

Aprende de tus errores

Progreso

Mide tu avance

Certificación

Valida tus habilidades

Ejercicios de programación en SpringBoot: Práctica y Certificación

Los ejercicios de programación son fundamentales para dominar SpringBoot. Este ejercicio está diseñado para poner a prueba tus conocimientos prácticos y ayudarte a consolidar lo aprendido en las lecciones teóricas. La práctica constante con ejercicios de programación es la clave para convertirte en un desarrollador experto.

¿Por qué resolver ejercicios de programación?

Resolver ejercicios de programación en SpringBoot te permite:

  • Aplicar conocimientos teóricos: Poner en práctica los conceptos aprendidos en las lecciones de SpringBoot.
  • Identificar áreas de mejora: Descubrir qué conceptos necesitas reforzar en tu aprendizaje de SpringBoot.
  • Prepararte para certificaciones: Los ejercicios te preparan para obtener certificados profesionales en SpringBoot.
  • Mejorar tu perfil profesional: Demostrar tus habilidades prácticas en SpringBoot.

Metodología de aprendizaje

Nuestros ejercicios de programación están diseñados siguiendo una metodología probada de aprendizaje progresivo. Cada ejercicio en SpringBoot está cuidadosamente estructurado para llevar tus habilidades al siguiente nivel. Comenzamos con conceptos fundamentales y avanzamos gradualmente hacia desafíos más complejos que reflejan situaciones reales del desarrollo de software profesional.

Certificación y validación de conocimientos

Al completar ejercicios de programación, no solo mejoras tus habilidades técnicas, sino que también puedes obtener certificados que validan tu expertise en SpringBoot. Estos certificados son reconocidos por empresas y pueden ser una gran adición a tu perfil profesional de LinkedIn o tu CV como desarrollador.

Los ejercicios están alineados con los estándares de la industria y cubren desde conceptos básicos hasta técnicas avanzadas de programación en SpringBoot. Cada ejercicio incluye casos de prueba y ejemplos prácticos que te ayudarán a comprender mejor cómo aplicar lo aprendido en proyectos reales.

Nota: Para obtener el máximo beneficio de este ejercicio de programación, te recomendamos revisar primero las lecciones relacionadas de SpringBoot y asegurarte de comprender los conceptos básicos antes de intentar resolver el ejercicio.