logo de hibernate

Revolviendo la web por ahí me encuentro con un muy pequeño ejemplo de cómo, con pocas líneas, testear todos los mapeos de Hibernate de una aplicación. El test comprueba que sintácticamente estén bien escritos todos los mapeos, que las columnas mapeadas existan y se puedan asignar a atributos de los objetos. Para hacer uso se utiliza el API de Hibernate para pedirle todos los mapeos que tiene, y luego se usa esta información para tirar un query por cada mapeo.

A continuación queda una versión levemente mejorada del código original, donde se limita la cantidad de resultados que devuelve el query (por si algun mapeo va contra una tabla muy grande).

El código a ejecutar

La porción de código que hace toda la magia es la siguiente:

 Map metadata = sessionFactory.getAllClassMetadata();

for (Iterator it = metadata.values().iterator(); it.hasNext();) {
EntityPersister persister = (EntityPersister) it.next();
Query q = session.createQuery("from " + persister.getEntityName() + " c");
q.setMaxResults(1);
q.iterate();
}

Dependiendo de su entorno, tendrán que encargarse de obtener la instancia del sessionFactory y de session (ambas clases de Hibernate), y cerrarlas.

Un test JUnit con Spring

Crear un test de JUnit4 integrado con Spring es sumamente facil y conveniente. Supondiendo que los archivos de configuracion application-db.xml y application-hibernate.xml contienen toda la información de acceso a datos y mapeos de la aplicación, el test quedaría como el ejemplo siguiente:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"/application-db.xml",
"/application-hibernate.xml"
})
public class HibernateTest extends AbstractTransactionalJUnit4SpringContextTests {

@Autowired
private SessionFactory sessionFactory;

private Session session;

@Before
public void setUp() {
session = sessionFactory.openSession();
}

@After
public void tearDown() {
session.close();
}

@Test
public void testearMapeos() {
Map metadata = sessionFactory.getAllClassMetadata();

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

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw