views:

453

answers:

3

Hello all,

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 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 (as per Maven convention) - there are a lot of files in here that i need to reference in my tests, but they are not available when running the test as they are not on the classpath (Maven only seems to be adding src/main/java, src/test/java, src/main/resources, src/test/resources to the classpath but not src/main/webapps)

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?

I can get around this by changing the Eclipse "Run Configurations" to include this folder on the classpath, but that will not work when running the tests from the command line?

Has anyone else encountered this? is there a know solution?

Thanks!

A: 

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.

Pascal Thivent
Thanks for the quick reply,The files I need are spring webmvc-config files, as i need to create a mock context for my web controller - and unfortunately the config files also contain reference to other files within the webapps folder.Fortunately I have now got around this by creating "test" spring config files that do not refer to any of the additional webapp resources that are not of relevance (just the controller beans required to unit test) and have put just my custom test config files in the src/test/resources.
rhinds
+2  A: 

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.

Emil
A: 

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.

Matt Fisher