2012-04-30 23 views
20

Cuando ejecuto mi aplicación en Tomcat el archivo de primavera-context.xml se encuentra enUbicación de la primavera-context.xml

/WEB-inf/spring-context.xml

Este está bien Pero ejecutar una prueba JUnit que la supla con la ubicación de mi primavera-test-context.xml así:

@ContextConfiguration(locations={"classpath:/spring-test-context.xml"}) 

La única forma en que esto funciona es si el archivo se encuentra en

/src/spring-context.xml

¿Cómo puedo obtener mi aplicación para encontrar mis archivos de contexto de primavera en la misma ubicación? ¿Para que funcione con junit test y se implemente en tomcat?

yo probamos este y me dio un montón de errores por no encontrar ningún frijoles, pero no dijo que no pudo encontrar el archivo ..

classpath:/WEB-INF/spring-test-context.xml 

Respuesta

38

Como insinuó duffymo, Spring TestContext Framework (TCF) asume que las ubicaciones de cadena se encuentran en la ruta de clase de manera predeterminada. Para obtener más información, consulte JavaDoc para ContextConfiguration.

Tenga en cuenta, sin embargo, que también puede especificar recursos en el sistema de archivos con una ruta absoluta o relativa utilizando la abstracción de recursos de Spring (es decir, utilizando el prefijo "file:"). Puede encontrar detalles sobre eso en JavaDoc para el método modifyLocations() en Spring's AbstractContextLoader.

Así, por ejemplo, si el archivo de configuración XML se encuentra en "src/main/webapp/WEB-INF/spring-config.xml" en su carpeta de proyecto, puede especificar la ubicación como una ruta del sistema de archivos relativa de la siguiente manera:

@ContextConfiguration("file:src/main/webapp/WEB-INF/spring-config.xml") 

Como alternativa, se puede almacenar los archivos de configuración de primavera en la ruta de clase (por ejemplo, src/main/resources) y después hacer referencia a ellos a través de la ruta de clase en su configuración de Spring MVC - por ejemplo:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:/spring-config.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

Con este enfoque, su configuración de prueba URACIÓN simplemente tener este aspecto (nótese la barra inicial que indica que el recurso está en la raíz de la ruta de clase):

@ContextConfiguration("/spring-config.xml") 

También puede encontrar la sección Context configuration with XML resources del manual de referencia útil.

Saludos,

Sam

(autor de la Spring Framework TestContext)

+0

excelente. Lo tengo trabajando con 'archivo: WebContent/WEB-INF/spring-context.xml' (no usando maven). ¡Gracias por la ayuda! – Tommy

+0

Uno debería mencionar que Spring de alguna manera sabe dónde se encuentra "src /". En mi configuración de mvn3/surefire/Spring, esto también funciona (y evita el doble de archivos de recursos), pero sospecho que Surefire prepara el contexto para Spring de forma que "src /" es un inicio válido (y "main /" no ser). Por lo tanto, debe saber dónde debe comenzar su camino "relativo" para que esto funcione. –

+0

'@ ContextConfiguration' ha admitido un atributo' classes' para JavaConfig desde Spring 3.1: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html# classes-- –

10

El problema es que/WEB-INF no está en CLASSPATH para una aplicación web. Sin embargo,/WEB-INF/classes es.

Su problema con las pruebas es que no se está ejecutando en un servidor de aplicaciones, por lo que WEB-INF/classes no es parte de CLASSPATH de forma predeterminada. Recomiendo configurar sus pruebas para que WEB-INF/classes esté en la prueba CLASSPATH o use una ruta de archivo relativa o absoluta para encontrarlas.

Cuestiones relacionadas