Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven中的单元测试需要访问src/main/webapp目录_Java_Unit Testing_Maven 2_Spring Mvc - Fatal编程技术网

Java Maven中的单元测试需要访问src/main/webapp目录

Java Maven中的单元测试需要访问src/main/webapp目录,java,unit-testing,maven-2,spring-mvc,Java,Unit Testing,Maven 2,Spring Mvc,我正在尝试对我在Maven/Eclipse中开发的webapp进行单元测试。这是一个SpringMVCwebapp,我需要一些单元测试来测试我的模型控制器 为此,我需要使用我的webapp config.xml文件来注入控制器,但是,我的所有配置(以及配置引用的其他相关文件)都在src/main/webapp目录中(根据Maven约定)-这里有很多文件我需要在测试中引用,但在运行测试时,它们不可用,因为它们不在类路径上(Maven似乎只将src/main/java、src/test/java、s

我正在尝试对我在Maven/Eclipse中开发的webapp进行单元测试。这是一个SpringMVCwebapp,我需要一些单元测试来测试我的模型控制器

为此,我需要使用我的webapp config.xml文件来注入控制器,但是,我的所有配置(以及配置引用的其他相关文件)都在src/main/webapp目录中(根据Maven约定)-这里有很多文件我需要在测试中引用,但在运行测试时,它们不可用,因为它们不在类路径上(Maven似乎只将src/main/java、src/test/java、src/main/resources、src/test/resources添加到类路径中,而不是src/main/webapps)

我不想为了测试而将我的整个webapp复制到src/test/resources文件夹中——还有其他方法可以访问它们吗

我可以通过更改Eclipse的“运行配置”来解决这个问题,将这个文件夹包含在类路径上,但是在从命令行运行测试时,这将不起作用

还有其他人遇到过这种情况吗?有什么解决办法吗

谢谢

为此,我需要使用我的webapp config.xml文件来注入控制器,但是,我的所有配置(以及配置引用的其他关联文件)都在src/main/webapp目录中

在单元测试期间,您还需要哪些文件

我不想为了测试而将我的整个webapp复制到src/test/resources文件夹中——还有其他方法可以访问它们吗


否。如果您希望它们位于类路径上,请将它们放在
src/main/resources
src/test/resources
中,
src/main/webapp
下的文件不在类路径上,因为它们不应该在类路径上。

一般来说,您应该使用mock(例如EasyMock或jMock)来处理控制器的单元测试;单元测试应与系统的其余部分隔离测试组件。 在Spring3中,您可以将控制器定义为带有注释的POJO,然后只需测试控制器,而不需要Spring进行任何交互

如果您希望进行更多的集成级测试,那么可以将配置文件的公共部分放在src/main/resources中,以便在类路径中访问它们。然后在src/test/resources中为测试使用特定于测试的配置。该文件可以将这些文件与您需要的任何内容一起导入,也可以使用@ContextConfiguration注释您的测试用例,以指定组装上下文所需的多个文件


有关具体示例,请参见此。在Spring中,还有一个不错的集成测试概述。

Emil的第一个链接正确地显示了正确的@ContextConfiguration位置

如果您的Spring配置文件位于src/main/webapp/**,那么它们在由Maven构建时将不在类路径上。要获取集成测试的配置,只需使用
文件:
前缀指定路径

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

如果使用Spring的STS插件创建一个新的SpringMVC项目,您会注意到应用程序上下文配置文件放在我的示例的位置。在集成测试中使用它们的方法是使用
文件指定路径:
前缀,如上所述。

使用maven surefire插件可以实现这一点,如下所示:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <additionalClasspathElements>
                <additionalClasspathElement>src\main\webapp\</additionalClasspathElement>
            </additionalClasspathElements>
        </configuration>
    </plugin>

感谢您的快速回复,我需要的文件是SpringWebMVC配置文件,因为我需要为我的web控制器创建一个模拟上下文-不幸的是,配置文件还包含对webapps文件夹中其他文件的引用。幸运的是,我现在通过创建“测试”spring配置文件绕过了这个问题,这些文件不引用任何不相关的额外webapp资源(只是单元测试所需的控制器bean)我有src/test/resources,但我的junit仍然在寻找src/main/webappIt,我使用@ContextConfiguration(locations={“classpath:/WEB-INF/beans.xml”})标记工作,首先感谢您的想法。但是你的建议是非常严格的。1.使用基于Windows的文件分隔符。2.使用相对路径。如果您从父Maven模块运行测试,它会将您的路径(src\main\webapp)添加到它的(父模块)路径中,结果您将获得到资源的非法路径。我会把它改为“${project.basedir}${file.separator}src${file.separator}main${file.separator}webapp”,还有一种更优雅的方式来访问资源。请尝试以下“getClass().getClassLoader().getResourceAsStream(“/WEB-INF/WEB.xml”)”。您可以使用File#listRoots方法将root dir替换为与操作系统无关的dir
getClass().getClassLoader().getResourceAsStream("classpath:webapp/WEB-INF/web.xml")