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


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

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

我不想将我的整个webapp复制到我的src / test / resources文件夹中只是为了测试 - 有没有其他方法可以访问它们?

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

有人遇到过这种情况么?有没有明智的解决方案?

谢谢!


1757
2018-04-23 14:08


起源



答案:


通常,您应该使用模拟(例如,EasyMock或jMock)来处理控制器的单元测试;单元测试应该与系统的其他部分隔离地测试组件。 在Spring 3中,您可以将控制器定义为带有注释的POJO,然后只需测试控制器而无需Spring的任何交互。

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

有关具体示例,请参阅此内容 关于集成测试Spring MVC的博客文章。该 测试Spring手册的章节 还有一个很好的Spring集成测试概述。


6
2018-04-23 15:06





Emil的第一个链接在显示正确的@ContextConfiguration位置时是正确的。

如果你的Spring配置文件在src / main / webapp / **中,那么当它们由Maven构建时它们不会在类路径上。要获得集成测试的配置,请使用简单指定路径 file: 字首。

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

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


4
2017-08-16 12:40





您可以使用maven-surefire-plugin实现此目的,如下所示:

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

现在,您可以通过这种方式访问​​web.xml,例如:

getClass().getClassLoader().getResourceAsStream("classpath:webapp/WEB-INF/web.xml")

3
2017-10-25 08:28



它使用@ContextConfiguration(locations = {“classpath:/WEB-INF/beans.xml”})对我有用 - Ena
马克,首先要感谢这个主意。但你的建议很难编码。 1.使用基于Windows的文件分隔符。 2.使用相对路径。如果从父Maven模块运行测试,它会将您的路径(src \ main \ webapp)添加到其(父模块)路径,因此您将获得资源的非法路径。我会将其更改为“<additionalClasspathElement> $ {project.basedir} $ {file.separator} src $ {file.separator} main $ {file.separator} webapp </ additionalClasspathElement>” - nickolay.laptev
此外,还有更优雅的方式来访问资源。尝试以下“getClass()。getClassLoader()。getResourceAsStream(”/ WEB-INF / web.xml“)”。您可以使用File#listRoots方法将OS目录替换为独立于操作系统的目录 - nickolay.laptev


答案:


通常,您应该使用模拟(例如,EasyMock或jMock)来处理控制器的单元测试;单元测试应该与系统的其他部分隔离地测试组件。 在Spring 3中,您可以将控制器定义为带有注释的POJO,然后只需测试控制器而无需Spring的任何交互。

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

有关具体示例,请参阅此内容 关于集成测试Spring MVC的博客文章。该 测试Spring手册的章节 还有一个很好的Spring集成测试概述。


6
2018-04-23 15:06





Emil的第一个链接在显示正确的@ContextConfiguration位置时是正确的。

如果你的Spring配置文件在src / main / webapp / **中,那么当它们由Maven构建时它们不会在类路径上。要获得集成测试的配置,请使用简单指定路径 file: 字首。

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

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


4
2017-08-16 12:40





您可以使用maven-surefire-plugin实现此目的,如下所示:

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

现在,您可以通过这种方式访问​​web.xml,例如:

getClass().getClassLoader().getResourceAsStream("classpath:webapp/WEB-INF/web.xml")

3
2017-10-25 08:28



它使用@ContextConfiguration(locations = {“classpath:/WEB-INF/beans.xml”})对我有用 - Ena
马克,首先要感谢这个主意。但你的建议很难编码。 1.使用基于Windows的文件分隔符。 2.使用相对路径。如果从父Maven模块运行测试,它会将您的路径(src \ main \ webapp)添加到其(父模块)路径,因此您将获得资源的非法路径。我会将其更改为“<additionalClasspathElement> $ {project.basedir} $ {file.separator} src $ {file.separator} main $ {file.separator} webapp </ additionalClasspathElement>” - nickolay.laptev
此外,还有更优雅的方式来访问资源。尝试以下“getClass()。getClassLoader()。getResourceAsStream(”/ WEB-INF / web.xml“)”。您可以使用File#listRoots方法将OS目录替换为独立于操作系统的目录 - nickolay.laptev


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

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

我不想将我的整个webapp复制到我的src / test / resources文件夹中只是为了测试 - 有没有其他方法可以访问它们?

不。如果您希望他们在类路径上,请将它们放入 src/main/resources 要么 src/test/resources,文件下 src/main/webapp 不属于类路径因为它们不应该。


0
2018-04-23 14:35



感谢快速回复,我需要的文件是spring webmvc-config文件,因为我需要为我的web控制器创建一个模拟上下文 - 不幸的是,配置文件还包含对webapps文件夹中其他文件的引用。幸运的是,我现在通过创建“测试”弹簧配置文件来解决这个问题,这些文件没有引用任何不相关的任何其他webapp资源(只是单元测试所需的控制器bean)并且只放置了我的自定义测试配置文件在src / test / resources中。 - rhinds