Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unit Test in Maven requires access to the src/main/webapp Directory

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!

like image 993
rhinds Avatar asked Apr 23 '10 14:04

rhinds


People also ask

What do we used to run unit test with Maven?

We can run our unit tests with Maven by using the command: mvn clean test. When we run this command at command prompt, we should see that the Maven Surefire Plugin runs our unit tests. We can now create a Maven project that compiles and runs unit tests which use JUnit 5.

What is SRC main Java in Maven?

The src/main Directory As the name indicates, src/main is the most important directory of a Maven project. Anything that is supposed to be part of an artifact, be it a jar or war, should be present here. Its subdirectories are: src/main/java – Java source code for the artifact.

What is test in Maven?

The Maven surefire plugin provides a “test” parameter that we can use to specify test classes or methods we want to execute. If we want to execute a single test class, we can execute the command: mvn test -Dtest=”TestClassName”.


3 Answers

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.

like image 74
Emil Sit Avatar answered Oct 14 '22 07:10

Emil Sit


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")
like image 43
Mark Avatar answered Oct 14 '22 08:10

Mark


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.

like image 38
Matt Avatar answered Oct 14 '22 07:10

Matt