Las pruebas de contexto de primavera no pueden encontrar las ubicaciones de configuración

votos
8

Tengo una gran aplicación distribuida en varios archivos XML de definición de Spring Bean. En mi suite de pruebas cargo manualmente los archivos XML que necesito usando FileSystemXmlApplicationContext para realizar las pruebas que deseo ejecutar. Esto reduce el tiempo de configuración de la prueba y me permite usar los mismos archivos de configuración exactos que se usan en la producción.

Ahora intento usar las clases base de prueba transaccional de Spring que toman las ubicaciones de configuración y cargan el contexto para 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 usando FileSystemXmlApplicationContext. Si antepongo todas mis ubicaciones de configuración con file:, se encuentran las rutas que especifico en mi prueba, pero no se pueden encontrar los archivos que son 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 de la misma manera que aquellas en las que creo el contexto yo mismo?

Por ejemplo, crear el contexto de esta manera 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};
 }
Publicado el 17/06/2009 a las 21:26
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
4

Ponemos todos nuestros archivos de configuración y propiedades Spring en 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 revisado cómo hace referencia a los archivos de propiedades en su services-context.xml? Sospecho que si agrega un archivo: a su configuración de contexto, también necesitará agregar esto a su referencia de archivo de propiedad. Tal vez podría simplemente usar un archivo de configuración Spring Spring para cambiar la definición del marcador de posición de su propiedad y colocarlo al final de su lista de archivos de contexto; sus definiciones anularán las definidas en archivos anteriores.

Respondida el 18/06/2009 a las 18:54
fuente por usuario

votos
3

Además de anular getConfigLocations, también reemplacé loadContext y utilicé un fileSystemXmlApplicationContext de confianza 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);
  }
Respondida el 17/06/2009 a las 22:31
fuente por usuario

votos
1

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

Respondida el 18/06/2009 a las 19:06
fuente por usuario

votos
1

Sus ubicaciones de configuración son URI relativas, y serán interpretadas como tales por la clase de prueba base, con el URI que se resuelve en relación con la ubicación de la clase de prueba. Intente utilizar URI totalmente calificados, o use URI relativo teniendo en cuenta dónde se encuentra la clase de prueba.

Respondida el 17/06/2009 a las 22:01
fuente por usuario

votos
0
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
Respondida el 25/06/2012 a las 09:50
fuente por usuario

votos
0

Otra posible solución es duplicar el services-config.xmly renombrar como services-config-test.xmly luego sometido a la ruta de clase. Lo mismo vale para el archivo de propiedades.

Respondida el 17/04/2011 a las 17:08
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more