Test Unitarios sobre controller con Response Entity y JUNIT

Bien, vamos a testear un Controller que nos retorna una Response Entity con el mensaje “Hello World!” junto a un código OK que sería el equivalente al status code 200.

Estructura del proyecto

La estructura del proyecto será:

Depedencias pom.xml

Para ello, primeramente importamos las dependencias:

Dentro de estas dependencias sobre las que trabajaremos tenemos:

  • Spring Boot Web Starter: Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container.
  • Spring Boot Test Starter: Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito.

No tests found with test runner ‘JUnit 5’

Si intentamos lanzar un test en JUnit 5 sin añadir las dependencias que nso faltan nos encontraremos con el siguiente error:

Para solucionar esto, debemos añadir las siguientes dependencias:

  • JUnit Jupiter API : Module “junit-vintage-api” of JUnit 5. Proporciona la API pública para escribir pruebas y extensiones.
  • JUnit Vintage Engine: Module “junit-vintage-engine” of JUnit 5. Contiene la implementación del motor de pruebas JUnit Jupiter que nos permitirá ejecutar pruebas unitarias. Además de permitirnos que las pruebas en JUnit 4 también de ejecuten.

Creando el Controlador

Una vez añadidas las dependencias, ya podemos crear el controlador con el ResponseEntity:

Y ya podemos empezar con los test. Para realizar los test tenemos varias maneras.

Test de Controller con @Autowired + @WebMvcTest

En este caso, vamos a realizar la llamada de la clase en concreto que queremos probar con WebMvcTest (sin montar la factoría de Beans = AplicationContext [Contexto]) la clase que vamos a llamar será IndexController.

Una vez hemos definido el @WebMvcTest, vamos a continuar con la llamada del controlador mediante a la clase Autowired.

Con Autowired evitamos el tener que realizar la asignación de un new IndexController, nos lo hace la anotación por debajo. Si no tendríamos que hacer lo siguiente (también veremos un ejemplo más abajo):

IndexController indexController = new IndexController();

Y finalmente definimos los Test, en este caso, vamos a definir tres test:

  • Comprobar si el status code es el 200.
  • Comprobar si el mensaje que se envía en el body no sea nulo.
  • Comprobar si el mensaje que se envía en el body es “Hello World!”. Lo correcto es que cada test compruebe una cosa

Para ejecutar el test podemos tenemos dos opciones:

  • Ejecutar todos los test que tengamos definidos dentro de la clase IndexControllerTest. El resultado será:

Otra manera de ejecutar todos los test es pulsando sobre el nombre dentro de la propia clase.

El resultado de ambos test será el mismo:

Si modificamos el texto del controlador y por ejemplo lo substituimos por Hello javer@s!

Y volvemos a ejecutar los todos test, podemos observar como en está ejecución nos fallará el itShoulSayHelloWorld. Si nos situamos sobre el test podremos ver cómo nos muestra que tenemos una expectativa diferente al resultado que hemos obtenido.

Mejorando el test anterior con la anotación @SpringBootTest

Una alternativa mejor que trabajar los test con la anotación @WebMvnTest es la anotación @SpringBootTest. Hablamos de alternativa mejor debido a que no tenemos que especificarle la clase a testear ya que al utilizar la anotación @SpringBootTest, Spring Boot nos proporciona/ busca la manera de iniciar el contexto de la aplicación para posteriormente utilizarlo en las pruebas. De esta manera no tendremos que modificar la clase de la anotación @WebMkvTest cada vez que cambiemos de controlador. Vamos a ver un ejemplo:

Test de Controller con new + @Before + @Spring BootTest

Al escribir pruebas, es común encontrar que varias pruebas necesitan crear objetos para que puedan ejecutarse. Una vez definido el objeto indexController que vamos a testear y como alternativa al @Autowired de los ejemplos anteriores. Para ello, utilizamos la anotación @Before que se ejecutará antes de que se ejecute el método org.junit.Test. Y dentro de esta anotación, añadiremos la creación del objeto.

Coverage As

Si ejecutamos el Coverage As, podemos ver que tenemos un 100 % de cobertura sobre el Controller.

Esto es todo, espero que os haya gustado y que controléis (nunca mejor dicho) los test sobre controladores ¡Un saludo javer@s!

2 comentarios

  1. Y el código del test? no se ve… jajaja

    • admin

      14 julio, 2020 a las 10:26

      Buenas Felipe,

      El código de los test si que está en el artículo. Fijate en la clase IndexControllerTest, en su interior se encuentran cada uno de los 3 test. Dichos tests, se definen a partir de la anotación @Test

      Un saludo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

La Ley 34/2002 nos obliga a avisarte de que usamos cookies propias y de terceros con objetivos estadísticos y de sesión y para mostrarte la 'publi' que nos da de comer. Tranquilo, este mensaje solo sale una vez. Más información

Java desde 0 comunica a los usuarios, a través de este aviso, que puede utilizar cookies cuando el usuario navega por las diferentes pantallas y páginas del sitio. Durante el uso de nuestra página Web usted acepta y autoriza expresamente el uso de cookies, de acuerdo con nuestra Política de Privacidad. Este sitio web utiliza las siguientes cookies propias: - Cookies de sesión, para garantizar que los usuarios que escriban comentarios en el blog sean humanos y no aplicaciones automatizadas. De esta forma se combate el spam. Este sitio web utiliza las siguientes cookies de terceros: - Google AdManager y AdSense: Utiliza cookies para mejorar la publicidad. Entre otros fines, suelen utilizarse para segmentarla según el contenido que sea relevante para los usuarios o su ubicación, mejorar los informes de rendimiento de las campañas y evitar mostrar anuncios que los usuarios ya hayan visto. Las cookies no contienen información personal identificable. Consulta cómo utiliza Google la información de sitios web o aplicaciones. y cómo bloquear determinados anuncios. - Google Analytics: Almacena cookies para poder elaborar estadísticas sobre el tráfico y volumen de visitas de esta web. Al utilizar este sitio web está consintiendo el tratamiento de información acerca de usted por Google. Por tanto, el ejercicio de cualquier derecho en este sentido deberá hacerlo comunicando directamente con Google. - Redes sociales: Cada red social utiliza sus propias cookies para que usted pueda pinchar en botones del tipo Me gusta o Compartir.

Cerrar