Utilizamos duales persistence.xml archivos de tiempo de ejecución de producción y de prueba, sino que es sólo una cuestión relacionada con la ruta de clases (usamos Eclipse pero no dependemos mucho de los complementos de WTP). La única diferencia entre los dos es que la versión de producción no contiene definiciones de entidad.
No utilizamos un marco de burla para probar JPA ya que esto no agregaría ningún valor a nuestras pruebas. Las pruebas sí ejecutan acceso a datos reales con JPA que habla con la base de datos PostgreSQL.
Nuestro enfoque de las pruebas se basa en el marco de prueba de Spring para la capa de persistencia: prueba en la transacción. Nuestra aplicación está basada en Spring, pero este enfoque es igualmente útil para aplicaciones arbitrarias que quieran aprovechar las clases de prueba de Spring. La esencia es que cada prueba se ejecuta dentro de una única transacción que nunca se compromete y al final (en tearDown) se revierte automáticamente. Esto resuelve el problema de la contaminación de datos y la dependencia de prueba de una manera muy agradable, discreta y transparente.
El marco de prueba de Spring es flexible para permitir las pruebas de transacciones múltiples, pero estos son casos especiales que constituyen no más del 10% de las pruebas.
Todavía utilizamos legacy support for JUnit 3.8 pero el nuevo Spring TestContext Framework para JUnit 4 se ve muy atractivo.
Para configurar los datos de prueba dentro de la transacción, utilizamos la clase de utilidad interna que construye las entidades comerciales. Dado que se comparte entre todas las pruebas, la sobrecarga para mantenerla y admitirla es muy superior a los beneficios de contar con una manera estándar y confiable de configurar los datos de prueba.
Spring DI ayuda a que las pruebas sean concisas y autodescriptivas, pero no es una característica crítica.
Este tipo de prueba que ha mencionado no es prueba unitaria. Creo que es una prueba de integración de tipo. Cuando escribe una prueba unitaria, prueba una clase con todas las dependencias ridiculizadas. Por lo tanto, usar una base de datos real (incluso bases de datos en memoria) en pruebas unitarias no es válida. –
No es una prueba de integración completa. ¡Es válido! Simplemente no es prueba de unidad. – Gilberto