21

当我在 tomcat 上运行我的应用程序时,spring-context.xml 文件位于

/WEB-inf/spring-context.xml

还行吧。但是运行 junit 测试我必须向它提供我的 spring-test-context.xml 的位置,如下所示:

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

唯一可行的方法是文件位于

/src/spring-context.xml

如何让我的应用程序在同一位置找到我的 spring-context 文件?这样它就可以与junit testes一起使用并部署在tomcat上?

我试过这个,它给了我很多关于找不到任何bean的错误,但它并没有说它找不到文件..

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

2 回答 2

39

正如 duffymo 所暗示的,Spring TestContext Framework (TCF) 假定字符串位置默认位于类路径中。有关详细信息,请参阅ContextConfiguration的 JavaDoc 。

但是请注意,您也可以使用 Spring 的资源抽象(即,通过使用“file:”前缀)在文件系统中指定资源的绝对路径或相对路径。您可以在 Spring 的modifyLocations()方法的 JavaDoc 中找到详细信息AbstractContextLoader

例如,如果您的 XML 配置文件位于"src/main/webapp/WEB-INF/spring-config.xml"项目文件夹中,您可以将位置指定为相对文件系统路径,如下所示:

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

作为替代方案,您可以将 Spring 配置文件存储在类路径中(例如,src/main/resources),然后通过 Spring MVC 配置中的类路径引用它们——例如:

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

使用这种方法,您的测试配置将看起来像这样(注意表示资源位于类路径的根目录中的前导斜杠):

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

您可能还会发现参考手册中的带有 XML 资源的上下文配置部分很有用。

问候,

山姆

(Spring TestContext 框架的作者)

于 2012-05-09T18:58:13.673 回答
11

问题是 /WEB-INF 不在 Web 应用程序的 CLASSPATH 中。但是,/WEB-INF/classes 是。

您的测试问题是您没有在应用服务器中运行,因此默认情况下 WEB-INF/classes 不是 CLASSPATH 的一部分。我建议设置您的测试,以便 WEB-INF/classes 位于测试 CLASSPATH 中,或者使用相对或绝对文件路径来查找它们。

于 2012-04-30T14:39:18.950 回答