我正在尝试对我在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)
我不想将我的整个网络应用程序复制到我的src / test / resources文件夹中,只是为了测试 - 有没有其他方法可以访问它们?
我可以通过更改Eclipse“运行配置”以在类路径中包含此文件夹来解决这个问题,但是从命令行运行测试时这不起作用?
还有其他人遇到过这个吗?有没有明智的解决方案?
谢谢!
答案 0 :(得分:6)
通常,您应该使用模拟(例如,EasyMock或jMock)来处理控制器的单元测试;单元测试应该与系统的其余部分隔离地测试组件。 在Spring 3中,您可以将控制器定义为带注释的POJO,然后只需测试控制器而不需要Spring的任何交互。
如果您希望进行更多集成级别测试,那么您可以将配置文件的公共部分放在src / main / resources中,以便在类路径中访问它们。然后在src / test / resources中使用测试特定配置进行测试。该文件可以将这些文件与您需要的任何内容一起导入,也可以使用@ContextConfiguration注释您的测试用例,以指定组装上下文所需的多个文件。
有关具体示例,请参阅此blog post on integration testing Spring MVC。 Testing chapter of the Spring manual对Spring中的集成测试也有一个很好的概述。
答案 1 :(得分:4)
Emil的第一个链接在显示正确的@ContextConfiguration位置时是正确的。
如果你的Spring配置文件在src / main / webapp / **中,那么当它们由Maven构建时它们不会在类路径上。要获得集成测试的配置,只需使用file:
前缀指定路径。
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/app-config.xml")
如果使用Spring的STS插件创建一个新的Spring MVC项目,您会注意到应用程序上下文配置文件放在我的示例的位置。然后,在集成测试中使用它们的方法是使用file:
前缀指定路径。
答案 2 :(得分:4)
您可以使用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 :(得分:0)
要做到这一点,我需要使用我的webapp配置.xml文件来注入控制器,但是,我的所有配置(以及配置引用的其他相关文件)都在src / main / webapp目录中
在单元测试期间,您还需要哪些文件?
我不想将我的整个网络应用程序复制到我的src / test / resources文件夹中,只是为了测试 - 有没有其他方法可以访问它们?
没有。如果您希望它们位于类路径中,请将它们放在src/main/resources
或src/test/resources
中,src/main/webapp
下的文件不在类路径中,因为它们不应该。