Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Presentando Junit5 y su porqué

Aunque reconozco que hoy en día parece absurdo tener que hablar de lo que representa Junit5, y el porqué se han de hacer test, la verdad es que todavía hay muchos programadores «profesionales» que se rebelan con la idea de hacer test.

Todos somos «muy buenos», y nuestros programas no fallan nunca, si, lo se, pero… que quereis que os diga, yo me voy a dormir más tranquilo si he podido comprobar que ese postulado es cierto!.

Tambien sé, que a pesar de eso, mañana estaré corriendo para arreglar un maldito error que no ví, pero… espero que solo sea uno, y, además, y más importante, mientras hago esa corrección podré volver a comprobar TODA mi aplicación, para verificar que esa modificación no genera otro error!

Realmente, pienso que el responsable de un proyecto no debería dar por acabado el proyecto hasta no tener un porcentaje muy alto de dicho proyecto cubierto con test. Esta filosofía, ya esta cubierta en los sistemas de despliegue automático, y deberíamos implementarlas hasta para hacer el mas pequeño trabajo, y, por eso, aunque no os convenza, vamos a utilizar los proximos capitulos para ver como podemos preparar test para nuestra aplicación de Los Cines….

Un test básico en Java

Nuestra primera propuesta, será hacer el test de cualquier clase, tiempo atrás, hicimos el test de un módulo estático como Rutinas, y ahora lo vamos a realizar de un controlador… aunque lo probaremos método a método, sin preocuparnos del sistema de redireccionamiento.

Vamos a probar únicamente el CineController. Esta clase, llama a la clase CineServicio para hacer cualquier cosa, y, nosotros no queremos evaluar AHORA CineServicio, con lo que utilizaremos Mockito para ocultarla.

Para poder escribirlo, necesitaremos las librerías de Junit5, aunque posiblemente ya estarán en pom.xml

Tambien crearemos una colección de paquetes reflejos, pero dentro de la zona «test»

Aunque, posiblemente, esta estructura tambien se habrá creado a la vez que proyecto

Ahora, vamos a crear la estructura de nuestra clase, con el boton derecho sobre CineController

He tenido que seleccionar Other, porque no me ha ofrecido JunitTestCase

Ahora, ya puedo seleccionarlo, comprobar la informacion que aparece

Aunque pulsaré «Next» para utilizar la siguiente pantalla

Y, en ella, seleccionar inicialmente los métodos que voy a probar; cuando pulsemos en Finish, se nos generará, en la zona de test, una clase preparada para que vayamos escribiendo nuestras pruebas, aunque funcionando desde el principio, dando error en todos los test.

Si se nos ocurre probar de hacer correr el test

Veremos, en la pantalla de Test que todos los métodos han fallado, y, en la parte inferior el motivo de error

Con eso, ya habeis visto como funciona el test, ahora solo falta hacerlo, y para ello, y por mi organización, le voy a cambiar el nombre a la clase a CineControllerTestJava, añadiendo la anotación

Primero necesito falsear CineService, por lo que construyo uno falso

A continuación, genero una serie de atributos que voy a utilizar al hacer las pruebas, ya que tendré que enviar datos, y comprobar que lo que me devuelve es lo esperado; de forma que pienso en estos

Tambien necesito un ObjectMapper para hacer conversiones a JSON o entre Cine y CineDTO, y un atributo para guardar la direccion del controlador…que como veis, no utilizo el Autowired….

Como en este test trabajaremos sin base de datos, necesito preparar las entradas, y eso lo hare en un método @BeroreEach que se ejecuta antes de cada test que se vaya a correr

Todo muy normal, creo instancias con new, y preparo los objetos según me interese. Solo quiero que observéis la carga del controlador (cineController = new CineController(cDao)), en donde el objeto dao que le paso, no es uno recibido de spring, sino uno creado con Mockito, esto es, falso, que luego podré manipular según me interese.

Otra cosa que tengo que preparar son funciones que me permitan comparar los objetos CineDTO que reciba, para ver si son iguales a los que espero, y, lo mismo que las listas, ya que eso es lo que voy a ir recibiendo cuando llame a un método.

No son demasiado complicadas; solo un poco molestas, pero…

Y con todo esto resuelto, vamos a realizar nuestro primer test, por ejemplo del método leerTodos. En este caso, nosotros no tenemos que pedir nada, y el controlador a de devolver una lista de CineDTO.

Como no vamos a acceder a la base de datos, deberemos instruir a nuestro Dao de lo que tiene que devolver, para ello

Me creo una lista con un cine, y luego indico que si alguien llama cDao.listAll(), se deberá devolver la lista

A continuacion, llamo al metodo del controlador que es leerTodos(), y recojo su respuesta

Si miramos la codificación del controlador veremos que invoca a cDao.listAll(), de alli, recibira la lista que hemos preparado de Cine, y lo debe convertir en CineDTO para devolverlo

por lo que en nuestro test, deberemos verificar que nos devuelve lo que hemos enviado

Si todo va bien, el test pasará

Vamos a ver otro ejemplo, el test de leerUno. Debemos indicar la id, aunque nos da lo mismo, ya que tambien aqui, debemos indicar previamente el comportamiento de cDao

Si nosotros, ahora le hacemos pa petición al controlador… y pedimos el 1, cDao devolverá la informacion correspondiente

y solo queda comprobarla. Atencion, si nosotros dijeramos leerUno(2L), el controlador lanzaría un cDao.leerUno(2), que no es la peticion prevista, por lo que no funcionaria el test.

Y asi sucesivamente, os invito a que lo intenteis escribir, y si no, podeis acudir a Github para comprobar el resultado. Para hecerlo, teneis que ver la llamada que haceis en el controlador a cDao en cada caso, y los datos que enviais a cDao, y los quenecesitais recibir, para crear la estructura

  • when(la llamada que se hara)thenReturn(lo que os interesa recibir) o
  • when(cDao.insert(any(Cine.class))).thenThrow(ConstraintViolationException.class)

En el segundo caso, por ejemplo, no me preocupan los valores del objeto Cine que se van a enviar, por lo que puedo utilizar el método any…. y en lugar de un valor, quiero que me devuelva un error (cosa que pasara si hay algun error en la clase Cine)

Este ultimo caso, es el test para comprobar que el controlador sabe manejar errores

Cuando ejecutemos todo el test, ahora, deberíamos obtener algo como esto

En donde vemos que todos los test han pasado.

Conclusión

Acabáis de ver un ejercicio de test que, aunque útil y funcional, deja mucho que desear, y solo lo he utilizado para empezar a mostrar los recursos, por lo que aunque en GitHub lo teneis totalmente resuelto, no seria el mejor test a escribir; ese lo veremos en el siguiente articulo.

De todas formas, os quiero, tambien dejar la realización en video, y, espero que esté listo antes del 25/4.

Este desarrollo esta hecho para disponer de un fuente para explicar otros temas, tal y como se indica en Visión de conjunto con Spring


Descubre más desde Recursos para formacion

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 18.97.14.80
Proxy: 18.97.14.80
Remote host: 18-97-14-80.crawl.commoncrawl.org
Remote port: 46374
** 18.97.14.80, 172.68.245.26