Un test para probar todos tus mapeos Hibernate

No hay tiempo para hacer tests
Es la excusa del desarrollador que aún no ha probado las ventajas del testing unitario. Yo personalmente opino que hay muchos tests que lo que hacen es precisamente (y entre otras cosas) reducir considerablemente la duración de un proyecto, sacando a la vista los bugs de codificacion o incluso defectos del diseño en plena fase de desarrollo, cuando el programador tiene el código fresco en su mente y antes de que puedan causar males mayores. Sin duda, el momento más eficiente de resolver estos defectos y no tener que esperar a tener una pantalla de la aplicación para poder probar el código.

Pero este post no pretende ser un alegato a favor del testing, ni siquiera del testing unitario. Sólo quería dejaros el siguiente código para poder testear todos los mapeos Hibernate de vuestros proyectos de un modo rápido y eficaz.

Map metadata = sessionFactory.getAllClassMetadata();
for (Iterator it = metadata.values().iterator(); it.hasNext();) {
EntityPersister persister = (EntityPersister) it.next();
Query q = session.
createQuery("from " + persister.getClassName() + " c");
q.iterate();
}
assertTrue(true);

Como veís es muy sencillo, hace un select para cada clase entidad Hibernate del proyecto.

He supuesto que la clase del test tiene un método setUp donde se crea una sessionFactory asociada a la configuración Hibernate de test y se obtiene un objeto session de ella. Y luego en el tearDown se liberan los recursos. Si usais Spring ésto no tendrá ningún misterio para vosotros. Por si acaso os dejo el código improvisado de una clase base en junit de la que pueden heredar vuestras clases test para Hibernate sin Spring.

public abstract class HibernateTestBase extends TestCase {

protected Session session;
protected SessionFactory sessionFactory;

protected void setUp() throws Exception {
super.setUp();
Configuration config = new Configuration().
configure("/hibernate-test.cfg.xml");
sessionFactory = config.buildSessionFactory();
session = sessionFactory.openSession();
}

protected void tearDown() throws Exception {
super.tearDown();
session.close();
sessionFactory.close();
}
}

En definitiva, se trata de un test muy rápido de construir y que os ahorrará mucho tiempo desarrollando entidades Hibernate. Pero no es perfecto, sólo prueba que los mapeos que has configurado se corresponden de verdad con una tabla y columnas que existen en la base de datos. Tiene los siguientes puntos débiles:
  • Cuantos más registros haya en las tablas, más lenta será la ejecución del test. Una opción es borrar todos los registros antes de empezar el test y al terminar hacer un rollback.
  • Si existieran registros que rompen las relaciones entre clases definidas el test fallará, aunque los mapeos sean correctos. La opción anterior también evitaría este punto.
  • No comprueba que el mapeo sea semánticamente correcto. Es decir, el atributo apellido1 podría estar mapeado a una columna APELLIDO2 y mientras dicha columna exista el test no fallará. Para evitar ésto no queda otra que hacer tests individuales para cada clase.

1 comentarios :: Un test para probar todos tus mapeos Hibernate

  1. Versión 2.0 en http://jcesarperez.blogspot.com/2009/12/un-test-para-todos-tus-mapeos-hibernate.html

Publicar un comentario en la entrada