当前位置: 首页 > 面试题库 >

spring junit load应用程序上下文进行测试

鲍永春
2023-03-14
问题内容

我的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并将公用部分(你也希望从集成测试中访问)移至src/main/resources/。然后写入特定于测试的配置文件src/test/resources/(如果你只需要从中导入几个不同的配置文件src/main以组装你的测试上下文,请跳过此步骤,并@ContextConfiguration优先使用)。

选项2(hack):
使用类似的引用:

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

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

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

现在详细说明:
之所以不能引用这些文件,classpath:/WEB-INF/*.xml是因为它们确实不在类路径中。重要的是要了解你的Web应用程序是如何打包的,以及最终在类路径上结束的内容。假设默认的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

要知道的最重要的一点是,classpath将只包含/WEB-INF/classes一个条目,其中的每个jar 都包含一个条目/WEB-INF/lib。因此,对于类加载器,这两个位置之外的资源是完全不可见的。直接位于下 的xml配置文件也是如此/WEB-INF,这就是为什么该引用classpath:/WEB-INF/dataSource.xml永远无法工作的原因。

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

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



 类似资料:
  • 我多年来一直在使用Spring MVC,我试图理解与Spring Boot的一些关键区别。 你能帮我确认一下吗?或者让我明白我在这里遗漏了什么?

  • 我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean

  • Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上,并添加了一些可能系统中所有组件将使用或偶尔需要的功能。 引导应用程序上下文 一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文。开箱即用,负责从外部源加载配置属性,还解

  • 问题内容: 我有一堆JUnit测试用例(集成测试),它们在逻辑上分为不同的测试类。 我们能够为每个测试类加载一次Spring应用程序上下文,然后将其重新用于JUnit测试类中的所有测试用例 但是,我们只是想知道是否有一种方法可以对一堆JUnit测试类仅加载一次Spring应用程序上下文。 FWIW,我们使用Spring 3.0.5,JUnit 4.5并使用Maven构建项目。 问题答案: 是的,这

  • 我有一个bean,它的业务逻辑从ApplicationContext中加载某种类型的bean,以便处理它们。 对于我的jUnit测试,我希望在我的单元测试类中创建一些虚拟bean,看看我的bean在测试中是否正确地处理它们。然而,我不确定什么是最好的方式来完成这一点。 有什么办法可以做到这一点吗?