spring junit为测试加载应用程序上下文

duc*_*cin 27 junit spring applicationcontext

我的WEB-INF目录下有一些XML文件:

  • lyricsBaseApp-servlet.xml中
  • hibernate.xml
  • dataSource.xml
  • beans.xml中

servlet xml导入其他xml文件:

<import resource="dataSource.xml"/>
<import resource="hibernate.xml"/>
<import resource="beans.xml"/>
Run Code Online (Sandbox Code Playgroud)

我希望我的junit4 JukeboxTest类包含整个弹簧配置.使用默认文件名我创建了一个JukeboxTest-content.xml文件.最后,我不知道该放什么......

我试过了:

<import resource="/WEB-INF/dataSource.xml"/>
<import resource="/WEB-INF/hibernate.xml"/>
<import resource="/WEB-INF/beans.xml"/>
Run Code Online (Sandbox Code Playgroud)

要么

<import resource="classpath:./WEB-INF/dataSource.xml"/>
<import resource="classpath:./WEB-INF/hibernate.xml"/>
<import resource="classpath:./WEB-INF/beans.xml"/>
Run Code Online (Sandbox Code Playgroud)

和其他一些想法,但都失败了.有人能指出我如何访问这些文件以及spring解释这些文件路径的方式是什么?

zag*_*gyi 84

选项1(应该首选,因为它是最佳实践):
重构您的配置文件WEB-INF并将公共部分(您也想从集成测试访问)移动到src/main/resources/.然后编写测试特定的配置文件src/test/resources/(如果您只需要导入几个不同的配置文件src/main来组装测试上下文,那么跳过这个,@ContextConfiguration最好使用).

选项2(hack):
使用如下引用:

@ContextConfiguration("file:src/main/webapp/WEB-INF/dataSource.xml")
Run Code Online (Sandbox Code Playgroud)

选项3(hack):
如果您有Maven项目,则可以配置maven-surefire-plugin(在测试阶段使用)src/main/webapp在测试执行期间声明为附加的classpath元素.

后两个选项被认为是hack,因为下面的文件src/main/webapp根本不应该在类路径上.

现在详细说明:

您无法引用这些文件的原因classpath:/WEB-INF/*.xml是它们确实不在类路径中.了解您的webapp如何打包以及最终在类路径上的结果非常重要.假设默认的Maven项目结构:

  1. Java类从编译后src/main/java转到/WEB-INF/classes.
  2. 从资源src/main/resources/WEB-INF/classes为好.
  3. 项目依赖性转到/WEB-INF/lib.
  4. 你所拥有的一切src/main/webapp/(包的根目录).这意味着当然src/main/webapp/WEB-INF要去所有文件/WEB-INF.

最重要的是要知道类路径只包含/WEB-INF/classes每个jar的一个条目/WEB-INF/lib.因此,这两个位置之外的资源对于类加载器是完全不可见的.直接在 xml配置文件也是如此/WEB-INF,这就是引用classpath:/WEB-INF/dataSource.xml永远不会起作用的原因.

您可能会问自己,如果从类路径无法访问这些xml配置文件,那么它们到底是怎么回事?答案很简单:当您启动webapp(而不是执行单元/集成测试)时,它在Servlet容器中运行,该容器提供对ServletContext(来自Servlet API的实际类)的访问,因此它用于ServletContext.getResourceAsStream()加载这些文件.理解的关键是以下来自此方法的javadoc的引用:

此方法与使用类加载器的java.lang.Class.getResourceAsStream不同.此方法允许servlet容器从任何位置为servlet提供资源,而无需使用类加载器.

对不起,这变得太长了,但这就是整个故事......


Kri*_*ris 12

试试这个

@ContextConfiguration(locations = {"classpath:**/dataSource.xml",
                               "classpath:**/hibernate.xml", 
                               "classpath:**/WEB-INF/beans.xml"})
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说适用于src/test/resources中的application-context.xml. (3认同)