2010-05-27 17 views
6

Tenemos una aplicación construida usando Spring/Hibernate/MySQL, ahora queremos probar la capa DAO, pero aquí hay algunas deficiencias que enfrentamos.Probando Hibernate DAO, sin construir el universo a su alrededor

Considere el caso de uso de varios objetos conectados entre sí, por ejemplo: El libro tiene páginas.

  • El objeto de página no puede existir sin el libro ya que book_id es obligatorio FK en Page.
  • Para probar una página, tengo que crear un libro.

Este sencillo uso es fácil de administrar, pero si comienza a construir una Biblioteca, hasta que no cree todo el universo que rodea el Libro y la Página, ¡no podrá probarlo!

Así que para probar la página;

  • Crear biblioteca
  • sección Crear
  • Crear Género
  • Crear Autor
  • Crear libro
  • Crear página
  • Ahora página de prueba.

Hay una forma fácil de pasar esta "creación del universo" y simplemente probar el objeto de la página de forma aislada. También quiero poder probar los HQL relacionados con Page. por ejemplo:

SELECT new com.test.BookPage (book.id, page.name) FROM Book book, Page page. 

JUnit se supone para funcionar de forma aislada, por lo que tengo que escribir el código para construir todos los objetos de apoyo en el caso de prueba para crear la página. Cualquier consejo sobre cómo acelerar el proceso.

Edit: Spring sigue la filosofía de retrotracción de la transacción después de que se hayan ejecutado las pruebas, por lo que revierte todos los cambios. Se esperan cambios en el esquema a medida que nos desarrollemos más, quiero poder probarlo contra el db de producción (¡copia de seguridad!) De forma regular.

+0

por qué wiki de la comunidad? – roufamatic

Respuesta

5

Acabo de terminar un proyecto con esta configuración exacta. Tuvimos mucho éxito utilizando una base de datos HSQLDB para las pruebas unitarias y luego desactivando la integridad referencial en el esquema para esas pruebas.

Dado que está utilizando la primavera, estos son los pasos:

  1. crear un nuevo archivo de configuración del contexto para la prueba. Configure hibernate para que haga create-drop para el esquema en esta configuración.
  2. Crea tu prueba de junio. Heredar de AbstractTransactionalJUnit4SpringContextTests, la clase abstracta más grande en la historia del universo, y anotar la clase con su nuevo @ContextConfiguration. También use la anotación @TransactionConfiguration para ejecutar cada prueba en una transacción con una reversión automática.
  3. ejecute el comando "SET REFERENTIAL_INTEGRITY FALSE;" a través de la propiedad heredada simpleJdbcTemplate en su método @Before.
  4. dedicar el resto de las llamadas @Before a simpleJdbcTemplate que configuran la base de datos.Tenga en cuenta que ya no necesita especificar cada columna referenciada, ¡solo lo que está probando!
  5. Finalmente, escriba sus pruebas unitarias contra sus DAO.

Aquí hay algunas referencias que les permite conocer en movimiento en esta dirección:

Como es habitual en estas cosas, conseguir la configuración justo es el disco parte. Pero una vez que todo esté funcionando, ¡serás un probador de la unidad de estilo!

+0

No me siento cómodo desconectando la integridad referencial incluso para las pruebas. –

+0

Para cada uno. Descubrí que, desde una perspectiva de prueba unitaria, mi dispositivo de prueba se redujo a la mitad cuando eliminé la integridad referencial. Como solo estaba interesado en probar las consultas HQL, no la configuración del esquema DB, funcionó muy bien. Además, dado que se trata de un sistema de base de datos totalmente diferente, en memoria, no hay que preocuparse por la corrupción de los datos de producción. – roufamatic

+0

No permitimos que hibernate genere el esquema, simplemente asignamos el objeto a SQL y ejecutamos la validación de hbm2ddl para asegurarnos de que cumpla con el estándar. También queremos asegurarnos de que la configuración del esquema sea la adecuada, es parte de la fase de prueba. –

3

Las extensiones de Unitil a junit o testng tienen un soporte muy bueno para esto. Le permiten definir conjuntos de datos sintonizados para su clase bajo prueba, de modo que solo necesita la parte del universo que su clase está viendo y luego inicializa la base de datos antes de que comiencen las pruebas.

pago y envío: link text

Nos lo están utilizando y que sólo funciona bien. Mucho mejor que los "MockRepositories" que utilizamos antes que no prueban el HQL y, también importante, los comportamientos de transacción de hibernación.

+0

Unitils parece prometedor, déjame explorarlo más y responderte. –

+0

Unitils ofrece más que solo las cosas de la base de datos, p. evaluadores de colecciones indulgentes. Es algo bueno tener en su cinturón de herramientas. –

Cuestiones relacionadas