I am trying to unit test a webapp that I am developing in Maven/Eclipse. It is a Spring MVC webapp, and I need some unit tests to test my model controller.
To do thi
Emil's first link was correct in showing the correct @ContextConfiguration location(s).
If your Spring configuration files are in src/main/webapp/**, then they will not be on the classpath when built by Maven. To get the configuration for integration testing, simple specify the path using the file:
prefix.
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/app-config.xml")
If using Spring's STS plugin to create a new Spring MVC project, you will notice that the application context config files are put in the location of my example. The way to use them in integration testing is then to specify the path using the file:
prefix as described above.
In general, you should be using mocks (e.g., EasyMock or jMock) to handle unit testing for your controller; a unit test should test a component in isolation from the rest of the system. In Spring 3, you can define your Controllers as a POJO with annotations and then simply test the Controllers without any interaction from Spring at all.
If you wish to do more integration-level testing, then you can place common parts of config files in src/main/resources so they become accessible in the classpath. Then use a test specific configuration in src/test/resources for your test. That file can either import those files along with anything you need, or you can annotate your test case with @ContextConfiguration to specify the multiple files that are needed to assemble the context.
For a concrete example, see this blog post on integration testing Spring MVC. The Testing chapter of the Spring manual also has a decent overview of integration testing in Spring.
To do this, I need to use my webapp config .xml files to inject the controller, however, all my configuration (and other associated files that the configs reference) are in the src/main/webapp directory
What are those files that you also need during unit tests exactly?
I do not want to have to copy my entire webapp in to my src/test/resources folder just for the purpose of testing - is there any other way to be able to access them?
No. If you want them to be on the classpath, put them either in src/main/resources
or src/test/resources
, files under src/main/webapp
are not on the classpath because they're not supposed to.
You can achieve this using maven-surefire-plugin as below:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<additionalClasspathElements>
<additionalClasspathElement>src\main\webapp\</additionalClasspathElement>
</additionalClasspathElements>
</configuration>
</plugin>
Now you can access your web.xml in this way for example:
getClass().getClassLoader().getResourceAsStream("classpath:webapp/WEB-INF/web.xml")