用于测试的junit弹簧负载应用上下文(spring junit load application

2019-07-20 03:03发布

我有我的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"/>

我想我的junit4 JukeboxTest类包括整个春天的配置。 使用默认的文件名我已经创建了一个JukeboxTest-content.xml文件。 最后,我不知道该怎么把那里...

我试过了:

<import resource="/WEB-INF/dataSource.xml"/>
<import resource="/WEB-INF/hibernate.xml"/>
<import resource="/WEB-INF/beans.xml"/>

要么

<import resource="classpath:./WEB-INF/dataSource.xml"/>
<import resource="classpath:./WEB-INF/hibernate.xml"/>
<import resource="classpath:./WEB-INF/beans.xml"/>

还有一些其他的想法,但都以失败告终。 可能有人点我如何访问这些文件和什么样的方式春天解释这些文件路径?

Answer 1:

选项1(应该是首选,因为它是最好的做法):
重构你的配置文件下的WEB-INF和移动公用部分(您想从集成测试也获得)来src/main/resources/ 。 然后写在测试特定的配置文件src/test/resources/ (如果你只需要从导入多个不同的配置文件src/main组装测试环境,然后跳过这一点,并使用@ContextConfiguration最好)。

选项2(劈):
使用引用,如:

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

选项3(劈):
如果你有Maven项目,则可以配置maven-surefire-plugin (在测试阶段中使用)申报src/main/webapp作为试验执行过程中的附加类路径元件。

后两种方案被认为是黑客,因为根据文件src/main/webapp根本不应该在classpath。

现在详细的解释:

为什么你不能指代这些文件作为理由classpath:/WEB-INF/*.xml是,他们确实不是在类路径中。 了解你的web应用程序是如何包装是很重要的,并且在classpath究竟结束。 假设一个默认的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 ,并在每个罐子一个入口/WEB-INF/lib 。 因此,这两个位置以外的资源的类加载器完全不可见。 这也是直属 XML配置文件真正的/WEB-INF ,这就是为什么引用classpath:/WEB-INF/dataSource.xml不会有任何效果。

你可能会问自己,到底是如何再由弹簧加载,如果他们不从classpath可达这些XML配置文件? 答案很简单:当你开始你的web应用(而不是执行刚刚单元/集成测试),它是在一个Servlet容器,它提供了访问正在运行ServletContext (从Servlet API中的实际类),所以它使用ServletContext.getResourceAsStream()来加载这些文件。 为理解的关键是从下面的报价的javadoc这个方法:

这种方法是从java.lang.Class.getResourceAsStream,它使用一个类装载器不同。 这种方法允许servlet容器来使资源可从任何地点一个servlet,而无需使用一个类加载器。

很抱歉,这变得太长,但是这是整个故事...



Answer 2:

试试这个

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


文章来源: spring junit load application context for tests