Pregunta

Tengo una aplicación grande distribuida en múltiples archivos xml de definición de Spring Bean. En mi conjunto de pruebas, cargo manualmente los archivos XML que necesito usando un FileSystemXmlApplicationContext para realizar las pruebas que quiero ejecutar. Esto reduce el tiempo de configuración de prueba y me permite usar los mismos archivos de configuración exactos que se usan en producción.

Ahora estoy tratando de usar las clases base de prueba transaccional de Spring que toman las ubicaciones de configuración y cargan el contexto por mí. Por alguna razón, cuando se crea el contexto de la aplicación, Spring no puede encontrar ninguno de los archivos de configuración. Esto es confuso porque ejecuto la prueba desde el mismo directorio de trabajo que cuando cargo la configuración yo mismo usando FileSystemXmlApplicationContext. Si antepongo todas mis ubicaciones de configuración con " archivo: " se encuentran las rutas que especifico en mi prueba, pero no se pueden encontrar los archivos importados o referenciados por beans definidos en la configuración (por ejemplo, archivos de propiedades). ¿Cual es el trato? ¿Puedo obtener pruebas que extiendan las clases de prueba de contexto de primavera para que funcionen igual que las que yo mismo creo?

Por ejemplo, crear un contexto como este funciona bien:

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

Si extiendo AbstractTransactionalDataSourceSpringContextTests, lo siguiente no encuentra services-context.xml:

@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

Esto encuentra el contexto de servicios, pero el PropertyPlaceholderConfigurer definido allí no puede encontrar sus archivos de propiedades.

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
¿Fue útil?

Solución 2

Además de anular getConfigLocations, también anulé loadContext y utilicé un archivo de confianza FileSystemXmlApplicationContext allí.

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }

Otros consejos

Ponemos todos nuestros archivos de configuración y propiedades de Spring en el classpath, lo que simplifica las cosas: podemos extender nuestras clases de prueba desde una clase base como:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

Aquí, las rutas son todas las rutas en classpath.

Si no quiere hacer eso, ¿ha verificado cómo hace referencia a los archivos de propiedades en su services-context.xml? Sospecho que si agrega el archivo: a su configuración de contexto, también deberá agregar esto a la referencia del archivo de propiedades. Tal vez podría simplemente usar un archivo de configuración Spring de prueba separado para cambiar la definición de su marcador de posición de propiedad y colocarlo al final de su lista de archivos de contexto; sus definiciones anularán las definidas en archivos anteriores.

Sus ubicaciones de configuración son URI relativos, y serán interpretadas como tales por la clase de prueba base, con el URI resuelto en relación con la ubicación de la clase de prueba en sí. Intente usar URI totalmente calificados, o use URI relativo teniendo en cuenta dónde está la clase de prueba.

¿No puede usar fábricas classpath XML como ClassPathXmlApplicationContext ?

Otra posible solución es duplicar services-config.xml y renombrarlo como services-config-test.xml y luego colocarlo en classpath. Lo mismo ocurre con el archivo de propiedades.

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top