2011-11-09 9 views
6

En la primavera/JUnit que es posible cargar archivos de contexto de aplicación usando @ContextConfiguration como¿Agregando dinámicamente la configuración del contexto del resorte en el tiempo de ejecución?

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 

Tengo un requisito en el que si veo una anotación especial en una clase de prueba a continuación, añadir otro archivo XML contexto dinámicamente. Por ejemplo:

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 
@MySpecialAnnotation 
class MyTest{ 
... 
} 

En el ejemplo anterior, buscaría @MySpecialAnnotation y añadir special-context.xml también. ¿Cuál es la mejor manera de hacer esto? He mirado esto por un tiempo y parece que subclasificar mi propio ContextLoader que es uno de los parámetros para @ContextConfiguration es el mejor enfoque? ¿Es esto correcto? ¿Hay una mejor manera de hacer esto?

+0

¿Qué quiere decir con dinámica. una anotación es estática, no lo hace cambiar en tiempo de ejecución? – Ralph

+0

Obviamente ese es el problema que trato de resolver. Me gustaría agregar dinámicamente un nuevo contexto a la lista de archivos que se carga la primavera. –

+0

Pero, ¿cuál es el significado de esa anotación? ¿Qué debería desencadenar el "ahora agregar contexto x"? – Ralph

Respuesta

2

resulta que la mejor solución es crear mi propia ContextLoader. hice esto al extender el abstracto.

public class MyCustomContextListener extends GenericXmlContextLoader implements ContextLoader { 
    @Override 
    protected String[] generateDefaultLocations(Class<?> clazz) { 
     List<String> locations = newArrayList(super.generateDefaultLocations(clazz)); 
     locations.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return locations.toArray(new String[locations.size()]); 
    } 

    @Override 
    protected String[] modifyLocations(Class<?> clazz, String... locations) { 
     List<String> files = newArrayList(super.modifyLocations(clazz, locations)); 
     files.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return files.toArray(new String[files.size()]); 
    } 

    private String[] findAdditionalContexts(Class<?> aClass) { 
     // Look for annotations and return 'em 
    } 
} 
+0

Cómo agregar y crear un caso de prueba para el mismo (no suite pero necesita un caso de prueba) para verificar y validar? – Kathir

2

Quizás pueda hacer uso de Spring 3.1 Profiles para lograrlo.

Si coloca los granos definidos en especial context.xml en un perfil llamado especial se puede activar el modo especial usando @Profile ("especial) en su clase.

Esto eliminaría la necesidad de su especial anotación en su totalidad.

Cuestiones relacionadas