test java hibernate spring junit hsqldb

java - spring boot test h2



Ejemplo de Spring/Hibernate/Junit de probar DAO contra HSQLDB (5)

La conclusión con hibernación es SessionFactory : su solución interna probablemente creará una de estas de alguna manera. Descubra cómo, y luego agregue un bean para crear uno en el contexto de su aplicación de prueba de la misma manera (o si es posible, usando su código interno que se usa en el tiempo de ejecución). Puede que necesite crear su propio FactoryBean para hacer la creación de instancias. (Use AbstractFactoryBean como su clase base.)

Una vez que esté en su lugar, la mayoría de los ejemplos que usan LocalSessionFactoryBean se pueden migrar a su situación; en lugar de usar LocalsessionFactoryBean, use su bean de fábrica personalizado.

(Si aún no lo ha hecho, consulte la sección Testing en la referencia de Spring: hace que las pruebas con Spring y las pruebas con frijoles en el contexto sean muy fáciles).

Estoy trabajando en intentar implementar una prueba JUnit para verificar la funcionalidad de un DAO. (El DAO creará / leerá una relación de objeto / tabla básica).

El problema que tengo es que la persistencia de la DAO (para el código que no es de prueba) se está completando a través de una solución interna que usa Spring / Hibernate , que elimina las plantillas habituales *.hbm.xml que la mayoría de los ejemplos que he encontrado Contiene.

Debido a esto, tengo algunos problemas para entender cómo configurar una prueba de JUnit para implementar el DAO para crear / leer (solo una funcionalidad muy básica) en 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 (no puedo obtener la configuración de application-context.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 al implementar los ejemplos que he encontrado.

editar:

Aquí está mi solución para una mejor legibilidad, para cualquier persona que necesite una mano para hacer las cosas:

  • 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>


Mi contexto de aplicación se ve un poco diferente

<beans:bean class="org.apache.commons.dbcp.BasicDataSource" id="HSQL_DS"> <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <beans:property name="url" value="jdbc:hsqldb:mem:Test"/> <beans:property name="username" value="sa"/> <beans:property name="password" value=""/> </beans:bean> <jdbc:embedded-database id="HSQL_DS"> <jdbc:script location="classpath:schema.sql"/> <jdbc:script location="classpath:data.sql"/> </jdbc:embedded-database>

y mi clase de prueba se parece a esto:

public class Tester { private EmbeddedDatabase db; @Before public void setUp(){ db = new EmbeddedDatabaseBuilder().addDefaultScripts().build(); } @Test public void TestMe(){ System.out.println("Testing"); } @After public void tearDown(){ db.shutdown(); } }



Spring 3 ofrece un nuevo espacio de nombres jdbc que incluye soporte para bases de datos incrustadas, incluyendo HSQLDB. Así que eso se encarga de esa parte.

Me pregunto cuál podría ser la "solución interna". Puede usar anotaciones (ya sea JPA o Hibernate) para ORM sus objetos de dominio, ¿por qué necesita una "solución interna"? P.ej:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:packagesToScan="myapp.model" />

En lo que respecta a la implementación de una prueba, use el Marco de TestContext de Spring. Una prueba puede tener este aspecto (nuevamente, asumo Spring 3 a continuación, aunque debería funcionar en Spring 2.5 simplemente cambiando @Inject a @Autowired):

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({ "/beans-datasource-it.xml", "/beans-dao.xml", "/beans-service.xml", "/beans-web.xml" }) @Transactional public class ContactControllerIT { @Inject private ContactController controller; ... setUp() and tearDown() ... @Test public void testGetContact() { String viewName = controller.getContact(request, 1L, model); ... assertions ... } }

beans-datasource-it.xml la base de datos integrada dentro de beans-datasource-it.xml , por ejemplo. (''it'' significa prueba de integración, y los archivos están en la ruta de clase.) El controlador en este ejemplo vive en beans-web.xml y se conectará automáticamente al campo ContactController .

Eso es solo un resumen de lo que se debe hacer, pero es de esperar que sea suficiente para comenzar.


Ver aqui Asume que maven2 es una herramienta de compilación, pero puede usar cualquier cosa fácilmente.