Hibernate Mapping: Testear mapeos

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 deHibernate), 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 configuracionapplication-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);
    }
}

No hay comentarios.: