gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:46:36 25 4
gpt4 key购买 nike

我的 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 类包含整个 spring 配置。我使用默认文件名创建了一个 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"/>

还有一些其他的想法,但都失败了。有人可以告诉我如何访问这些文件以及 spring 以什么方式解释这些文件路径?

最佳答案

选项 1(应该首选,因为它是最佳做法):
WEB-INF 下重构您的配置文件并将公共(public)部分(您也希望从集成测试中访问)移动到 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 作为额外的类路径元素测试执行。

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

现在详细解释:

您不能将这些文件称为 classpath:/WEB-INF/*.xml 的原因是它们确实不在类路径中。了解您的 web 应用程序是如何打包的,以及类路径中的最终结果是什么,这一点很重要。假设一个默认的 Maven 项目结构:

  1. src/main/java 中的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 中每个 jar 的一个条目。因此,这两个位置之外的资源对于类加载器来说是完全不可见的。对于 直接在 /WEB-INF 下的 xml 配置文件也是如此,这就是为什么引用 classpath:/WEB-INF/dataSource.xml 永远不会工作。

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

This method is different from java.lang.Class.getResourceAsStream, which uses a class loader. This method allows servlet containers to make a resource available to a servlet from any location, without using a class loader.

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

关于用于测试的 spring junit 加载应用程序上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com