开发者

Eclipse/Maven: JUnit tests not compiled when running them

I am working on a project using Maven and Eclipse (m2eclipse plugin). I've got problems with the JUnit tests:

Sometimes, when running them within Eclipse, they wont be compiled, but the old class files are used instead. When I delete the class files, I get ClassNotFoundExceptions in Eclipse. I then have to manually recompile them by using mvn test-compile or other goals.

I also noticed that the class files of the tests sometimes are put into the classes subdirectory instead of test-classes.

I really can't figure out what is wrong.

The JUnit java files are within src/main/java and are correctly named (*Test.java).

Do I have to compile and run them always via Maven? Why doesn't Eclipse compile the files when I want to run them? (Interestingly, sometimes开发者_运维技巧 it does. Sometimes everything works perfectly.)


I had the same problem with STS Eclipse (Spring development variant), m2e and JUnit. The solution was to set the output folder for src/test/java to target/test-classes:

  1. Right click the src/test/java folder in the Package Explorer
  2. Select Build Path -> Configure Output Folder
  3. Enter target/test-classes, click OK

Now the changes in test classes are compiled correctly and you should be able to run JUnit tests in Eclipse.

The problem is that Eclipse compiles the unit tests to the default output folder target/classes while JUnit plugin correctly tries to run them from test-classes.

There are a few duplicates to this question:

  • ClassNotFoundException when running JUnit unit tests within Eclipse (using Maven)
  • Eclipse doesn't see my new junit test
  • junit not using the newest file


In addition to the answer below

  1. Right click the src/test/java folder
  2. Select Build Path -> Configure Output Folder
  3. Enter target/test-classes, click OK

you should check to ensure that your builder is setup correctly by right clicking your project and going to Properties -> Builder. If you see that your builder is missing, you need to install one. In my case, the maven project had an AspectJ dependency and when I used the Maven Eclipse plugin to build my Eclipse project, it was looking for an AspectJ builder by default. I installed the AspectJ development tools and it solved the problem.

Hope this helps!


The most likely explanations for the problem you are facing is that the output folder of src/test/java is not correctly configured.

Instead of fixing this configuration manually, you can have m2eclipse fix this for you: Just right-click on the project and choose Maven > Update Project.


And another point: JUnit test classes should be in src/test/java, not src/main/java, otherwise they aren't detected correctly by Maven as test classes and they would be included in the packaged jar and not in the test jar.


I faced same issue. Tried above suggestions of configuring output folder & Maven>Update Project but neither worked. Finally changed my testOutputDirectory to "build/classes" as well and now Unit Tests are getting picked up and executed.

Finally found the reason for the issue. In my pom we had also configured maven compiler plugin as below

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <outputDirectory>build/classes</outputDirectory>
            </configuration>
       </plugin>

outputDirectory configuration is not needed and was the cause of above issue. After removing this tag, junits are getting compiled to build>testclasses folder and are being run during maven build as well. Yippee :)


Please check "testSourceDirectory" path which can be configured in your pom.xml. And then, Add the folder (configured in "testSourceDirectory" path) to the eclipse build path.

Please find the sample "testSourceDirectory" in pom.xml below:

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <plugins>
     <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>      
    </plugins>
  </build>


Make sure that is there any exclamation mark on your project icon! In my case, i ignored that there is a exclamation point like: exclamation point on project icon

Open the "Markers" perspective, then troubleshoot the problems according to the tips. what the "Markers" perspective show

The junit test classes can be execute successfully after i called "mvn clean test" because they are not refer the unreadable jar which be warned in "Markers" perspective.Therefor, it's easily to ignore it..


For someone working on java-scala mix project, this is something to note. Even after doing the configuration in the manner shown below,

<build>
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    <plugins>
    ...
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
                <testSourceDir>${basedir}/src/test/scala</testSourceDir>
                <testOutputDir>${basedir}/target/test-classes</testOutputDir>
            </configuration>
         </plugin>
    </plugins>
</build>

and doing a Maven > Update Project, eclipse honours the output directory of the src/test/java folder in the project, however, not for the src/test/scala folder. (You can figure this out by right-clicking on the specific source folder and choosing Build Path > Configure Output Folder... which should display the location as specified in the pom for the former case, however, not for the later case.

This is already a known bug for using scala with m2e as mentioned here: http://scala-ide.org/docs/tutorials/m2eclipse/

Warning

As of March 2013, a bug causes both src/main/scala and src/test/scala to use the default output folder (target/classes). This may be confusing >when building tests, since their class files will not end in target/test-classes, as they would when building on the command line. You can work around this by manually changing the output folder for src/test/scala.


Eclipse is not expecting anything else to be mucking with the class files. It assumes that if you haven't editted the file in eclipse it hasn't changed and doesn't need compiling. I think the issue stems from eclipse and maven sharing an output directory. I've often seen this if my mvn build fails, it will have deleted the class files as part of the clean but not compiled new ones. I think the best solution would be to have seperate build dirs for mvn and eclipse, but I've never look into this.


My problem wasn't the JUnit plugin but rather the configuration in my pom.xml.

After reviewing all the answers to this question, @Gulats's answer implied to me that I should try setting a testOutputDirectory in my maven-compiler-plugin section, and that did the trick:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <testOutputDir>${basedir}/target/test-classes</testOutputDir>
  </configuration>
</plugin>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜