Estoy trabajando para intentar implementar una prueba JUnit para verificar la funcionalidad de un DAO. (El DAO creará/leerá una relación básica de objeto/tabla).Spring/Hibernate/Junit ejemplo de prueba DAO contra HSQLDB
El problema que estoy teniendo es la persistencia de la DAO (para el código no prueba) se está completando a través de una solución interna usando Primavera/Hibernate, lo que elimina las habituales *.hbm.xml
plantillas que la mayoría de los ejemplos I han encontrado contener.
Debido a esto, estoy teniendo algunos problemas para entender cómo configurar una prueba JUnit para implementar el DAO para crear/lectura (solo una funcionalidad muy básica) a un HSQLDB en memoria . He encontrado algunos ejemplos, pero el uso de la persistencia interna significa que no puedo extender algunas de las clases que muestran los ejemplos (parece que no puedo obtener la configuración de la aplicación-contexto.xml correctamente).
¿Alguien puede sugerir algún proyecto/ejemplo que pueda ver (o cualquier documentación) para comprender mejor la mejor manera de implementar esta funcionalidad de prueba? Siento que esto debería ser realmente simple, pero sigo teniendo problemas para implementar los ejemplos que he encontrado.
edición:
Aquí está mi solución para una mejor legibilidad, para cualquier persona que necesita una mano que las cosas se van:
Mi
TestClass
:@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContextTest-Example.xml") @Transactional public class ExampleDaoTest extends AbstractTransactionalJUnit4SpringContextTests { @Resource(name = "sessionFactory") private SessionFactory exampleSessionFactory; @Resource(name = "exampleDao") private ExampleDao exampleDao;
Mi archivo
applicationContext.xml
:<!-- List of Daos to be tested --> <bean id="exampleDao" class="org.myExample.ExampleDao"/> <!-- Datasource --> <bean id="example_dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <property name="url" value="jdbc:hsqldb:mem:ExampleTest"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean> <!-- Session Factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="example_dataSource"/> <property name="annotatedClasses"> <list> <value>org.myExample.ExampleClass</value> </list> </property> <property name="hibernateProperties"> .... left to user to choose properties </property> </bean>
Alguna información adicional: no estoy muy experimentado con la configur de Spring/Hibernate, ya los he configurado en proyectos anteriores hasta ahora. Mi proyecto actual es una mezcolanza de configuraciones, no puedo entender cómo la clase "interna" a la que me refiero obtiene su fábrica de sesiones. Todos los DAO lo extienden (una clase abstracta), y dentro hay una declaración abstracta: public sessionFactory getSessionFactory(); No puedo averiguar de dónde viene el método "getSessionFactory()". Creo que debe ser inyectado por Spring de alguna manera, pero no puedo encontrar ningún archivo de configuración. –
Gracias muchachos, todos han sido útiles. Para aquellos en el futuro: Incluí en mi prueba de unidad (a través de @ContextConfiguration como especifica Willie) mi archivo applicationContext-Test.xml en el que definí un origen de datos HSQLDB, fábrica de sesiones, administrador de transacciones y Daos como beans . Mi clase Test está anotada con: @RunWith (SpringJUnit4ClassRunner.class), @ContextConfiguration (locations = "su appContext.xml") @Transactional, y mi sesión factory & dao están anotados como recursos (desde .xml defs): @ Recurso (name = "sessionFactory") –