位置

2012-04-30 28 views
20

當我在Tomcat上運行我的應用程序的彈簧context.xml文件位於位置

/WEB-inf/spring-context.xml

這沒問題。但在運行JUnit測試我已經與我的彈簧試驗context.xml中的這樣的位置爲它供給:

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

這個作品的唯一方法是,如果該文件位於

/src/spring-context.xml

如何讓我的應用程序在同一位置找到我的spring-context文件?這樣它可以與junit testes一起工作並部署在tomcat上?

我嘗試這樣做,它給了我很多關於沒有發現任何錯誤豆的,但它並沒有說這是不可能找到的文件..

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

回答

38

正如duffymo暗示的那樣,Spring TestContext Framework(TCF)假定字符串位置默認在類路徑中。有關詳細信息,請參閱JavaDoc for ContextConfiguration

但是,請注意,您也可以使用Spring的資源抽象(即使用「file:」前綴)在絕對路徑或相對路徑中指定文件系統中的資源。您可以在Spring的AbstractContextLoader中的modifyLocations()方法的JavaDoc中找到有關該方法的詳細信息。

因此,舉例來說,如果你的XML配置文件位於"src/main/webapp/WEB-INF/spring-config.xml"在項目文件夾,你可以作爲一個相對文件系統路徑指定位置如下:

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

作爲替代方案,你可以存儲在類路徑中(例如,src/main/resources),然後通過在Spring MVC配置classpath中引用它們的Spring配置文件 - 例如:

<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> 

通過這種方法,您的測試配置uration只會像這樣(注意斜線即表示該資源在類路徑的根):

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

您也可能會發現有用的參考手冊的Context configuration with XML resources部分。

問候,

山姆

(Spring的TestContext框架的作者)

+0

優秀。使用'file:WebContent/WEB-INF/spring-context.xml'來處理它(不使用maven)。謝謝您的幫助! – Tommy

+0

應該提一下,Spring以某種方式知道「src /」的位置。在我的mvn3/surefire/Spring設置中,它也可以工作(並且防止資源文件加倍),但是我懷疑Surefire以「src /」是有效開始的方式爲Spring準備上下文(並且「main /」不會是)。因此,您應該知道,您的「相對」路徑必須從何處開始才能實現。 –

+0

自從Spring 3.1以來'@ ContextConfiguration'支持JavaConfig的''''''屬性:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html#類 - –

10

的問題是,/ WEB-INF不在Web應用程序的CLASSPATH中。但是,/ WEB-INF/classes是。

您的測試問題是您未在應用程序服務器中運行,因此默認情況下WEB-INF/classes不屬於CLASSPATH。我建議設置你的測試,使得WEB-INF/classes在測試CLASSPATH中,或者使用相對或絕對文件路徑來找到它們。