2011-12-14 17 views
54

Tenemos un montón de casos de prueba JUnit (pruebas de integración) y se agrupan lógicamente en diferentes clases de prueba.Contexto de aplicación de primavera de reutilización en las clases de prueba junit

Estamos en condiciones de cargar contexto de aplicación de la primavera una vez por clase de prueba y volver a utilizarla para todos los casos de prueba en una clase de prueba JUnit como se menciona en http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html

Sin embargo, nos estábamos preguntando si hay una manera de cargue el contexto de la aplicación Spring solo una vez para un grupo de clases de prueba JUnit.

FWIW, usamos Spring 3.0.5, JUnit 4.5 y usamos Maven para construir el proyecto.

+0

Todas las respuestas a continuación son grandes, pero no tengo una context.xml. ¿He anotado mi camino en el olvido? ¿Alguna forma de hacer esto sin un context.xml? – markthegrea

Respuesta

67

Sí, esto es perfectamente posible. Todo lo que tiene que hacer es usar el mismo atributo locations en sus clases de prueba: contextos de aplicación cachés

@ContextConfiguration(locations = "classpath:test-context.xml") 

primavera por locations atributo de modo que si el mismo locations aparece por segunda vez, la primavera utiliza el mismo contexto en lugar de crear uno nuevo.

Escribí un artículo sobre esta característica: Speeding up Spring integration tests. También se describe en detalle en la documentación de Spring: 9.3.2.1 Context management and caching.

Esto tiene una implicación interesante. Debido a que Spring no sabe cuándo JUnit está hecho, almacena en caché todo el contexto para siempre y los cierra utilizando el gancho de cierre de JVM. Este comportamiento (especialmente cuando tiene muchas clases de prueba con diferentes locations) puede provocar un uso excesivo de memoria, pérdidas de memoria, etc. Otra ventaja del contexto de almacenamiento en caché.

+0

¡Ah! No me di cuenta de eso. Hemos estado siguiendo este enfoque durante mucho tiempo y he (erróneamente) atribuido la larga duración de la ejecución de prueba a la carga de contexto de primavera con cada clase de prueba. Verificaré cuidadosamente ahora. Gracias. – Ramesh

+0

Preferiría decir que la primavera no tiene conocimiento sobre el orden de ejecución de sus pruebas. Como resultado de esto, no puede decir si el contexto se requiere más adelante, o puede eliminarse. – philnate

+1

No veo cómo esto puede ser verdad. Eclipse/JUnit gasta 2 minutos en reiniciar el entorno cada vez que realizo una prueba Ejecutar como/JUnit. Esto no sucedería si algo estuviera almacenado en caché. – user1944491

22

Para agregar a Tomasz Nurkiewicz's answer, a partir de Spring 3.2.2 @ContextHierarchy la anotación se puede usar para tener una estructura de contexto múltiple separada y asociada. Esto es útil cuando varias clases de prueba desean compartir (por ejemplo) configuraciones de bases de datos en memoria (origen de datos, EntityManagerFactory, tx manager, etc.).

Por ejemplo:

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("FirstTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class FirstTest { 
... 
} 

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("SecondTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SecondTest { 
... 
} 

Al tener esta configuración el contexto que utiliza "prueba-db-setup-context.xml", sólo se creará una vez, pero los granos en su interior se puede inyectar a la prueba de unidad individual contexto

más en el manual: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management (búsqueda de "context hierarchy")

+0

Tengo maven multi-módulo, y trato de evitar la configuración de la base de datos en el módulo de servicio (como ya está cargado con las pruebas de módulo de acceso a datos) y no funciona para mí! –

+2

¡Esto funcionó para mí! Gracias. Para que quede claro, sin la anotación @ContextHierarchy, la primavera carga mi db para cada prueba. Estoy usando el parámetro "clases": @ContextConfiguration (classes = {JpaConfigTest.class, ... – Brel

+4

¿Alguna idea de si esto se puede hacer completamente a través de anotaciones en lugar de usar un XML para la definición de contexto? He buscado mucho sobre en el documento y aquí en SO, pero no pude encontrar nada que me lleve a pensar que no es posible. –

Cuestiones relacionadas