mundo hola application java unit-testing hibernate junit

java - hola - hibernate web application



Unidad probando una aplicaciĆ³n impulsada por Hibernate? (10)

¿Mejores prácticas? Uso Spring y hago transaccionales todas mis pruebas. Realizo la prueba y restituyo todos los cambios para no cambiar el estado de la base de datos.

Puede que esta sea una pregunta ingenua, pero soy nuevo en los frameworks junit e hibernate y me preguntaba cuál sería la mejor forma de probar la unidad de una aplicación que es en gran parte llamada a hibernar, o si es necesario hacerlo.

¿Cuál es la mejor práctica aquí?

EDITAR:
La primavera parece ser la gran sugerencia aquí. Desafortunadamente, esto puede ser un poco demasiado para morder para un proyecto. Junit, Hibernate y Spring son nuevas para mí, y si bien son todas las tecnologías que quiero poner en mi haber, creo que tratar de incorporarlas a todas en un proyecto puede ser demasiado abrumador para mí.

Enlaces a tutoriales y / o sugerencias de libros son bienvenidos.


Claro, harías una prueba unitaria de tu nivel de persistencia si no estuviera escrito en Hibernate, ¿verdad?

Cree una interfaz de persistencia determinada que se implemente utilizando Hibernate, cree instancias de algunos objetos de muestra, realice operaciones CRUD y solicite a JUnit que afirme que las operaciones fueron exitosas. Igual que cualquier otra clase.


Dos casos son fáciles de probar:

  1. Cuando sea práctico, realice sus diversos cálculos y transformaciones en funciones que no saben sobre cómo guardar o cargar entidades. Si puedes hacer estas funciones puras, mucho mejor.

  2. Para funciones que solo se guardan en la base de datos sin leer de ella, puede optar por no guardarlas durante la prueba.

La forma más simple (más cruda) de hacer # 2 es agregar un parámetro reallyUpdate a la función, luego rodear cada llamada "guardar" con:

if (reallyUpdate) { HibernateUtil.saveOrUpdate(theThing); }

Para mí, estas fueron las frutas más colgantes.


En cuanto a las mejores prácticas:

utilice una base de datos incrustada para ejecutar sus pruebas si es posible, de modo que no necesite una base de datos relacional desplegada para ejecutar sus pruebas (localmente o en su servidor de compilación continua si tiene una). De esta forma, no es necesario (necesariamente) preocuparse por retroceder, etc., solo puede recrear la base de datos cuando lo necesite. Las pruebas con una base de datos incrustada no prueban las peculiaridades que podrían aparecer cuando usa su base de datos de producción específica, pero sí prueba su código, que debería ser suficiente.

También puede usar DbUnit , una extensión de JUnit, para llenar fácilmente la base de datos con las filas esperadas y ponerla en un estado conocido, antes de ejecutar las pruebas de Hibernate.


Escribe una capa simple que pase las solicitudes a Hibernate. A continuación, utilice una biblioteca de burlas como EasyMock o JMock para afirmar que las clases de su aplicación llaman correctamente a su capa Hibernate-chapa. Esto está muy bien descrito en el libro JMock parcialmente completo (desplácese hacia abajo hasta el olor de prueba "todo se burla").


La fuente de Hibernate incluye muchas pruebas unitarias, recomendaría revisarlas y adaptar un enfoque similar.

También puede consultar el CaveatEmptor que la aplicación de muestra desarrolló para el libro "Persistencia de Java con Hibernate"


Me gusta usar un hsqldb en memoria para probar. El proceso para cada POJO hibernado es:

  1. Crea el objeto
  2. Persistirlo al DB
  3. Borrar la sesión
  4. Obtenlo de DB
  5. Afirma que los objetos son iguales.

Para los DAO, creo y persisto suficientes objetos para probar con precisión los métodos, luego ejecuto las pruebas y elimino los objetos según sea necesario para no interferir con otras pruebas.


Podría usar Spring para ayudar aquí.

Tiene un gran marco de pruebas unitarias, puede usarlo para probar operaciones CRUD y luego revertir cambios; excelente si no tiene la capacidad de volver a cargar una base de datos cada vez.


Si está utilizando Hibernate para modelos ricos en dominios, la lógica de dominio de prueba unitaria es tan simple como probar un POJO y Hibernate no se interpone en su camino. La única advertencia aquí es: para las asignaciones bidireccionales, es posible que deba establecer el objeto en ambos lados para las pruebas unitarias.

Las pruebas de integración con la base de datos generalmente no se realizan para asignaciones simples. Sin embargo, se sugiere en el caso de mapeos exquisitos como herencia de tabla única, etc. Lo único que hay que recordar aquí es que, en ocasiones, tendrás que vaciar explícitamente a la base de datos.


Tenga en cuenta la diferencia entre las pruebas unitarias y las pruebas de integración.

Las pruebas unitarias deben probar el código sin ninguna dependencia externa. Estas dependencias se burlan usando un marco como, por ejemplo, JMock.

Las pruebas de integración también son importantes, pero la principal desventaja de ellas es que tardan mucho tiempo en ejecutarse. Puede ejecutar miles de pruebas de unidades verdaderas en un par de segundos, pero no es lo mismo con las pruebas de integración.

Dependiendo del tamaño de su proyecto / equipo de desarrollo, es posible que desee priorizar las pruebas de unidades verdaderas sobre las pruebas de integración. Ambos estilos de pruebas son importantes, pero si se le presiona para obtener recursos, solo ir con las pruebas de Unidad puede ser una mejor idea.

Escribí una aplicación por mi cuenta, esa unidad probó la Web (con Spring MVC esto es fácil) y capas de servicio, así como también objetos de dominio. Pero dejé el DAO solo porque no quería escribir un montón de pruebas de integración lenta. Si tuviera más personas en el personal, también me habría ido con pruebas de integración, pero en este caso no creo que el tiempo gastado valga la pena.