Eclipse/Maven: 运行JUnit测试时未编译测试

74

我正在使用Maven和Eclipse(m2eclipse插件)开展一个项目,但是在JUnit测试方面遇到了问题:

有时,在Eclipse中运行测试时,它们不会被编译,而是使用旧的类文件。当我删除类文件时,在Eclipse中会出现ClassNotFoundExceptions异常。然后我必须手动重新编译它们,使用mvn test-compile或其他目标。

我还注意到,测试的类文件有时会被放置在classes子目录而不是test-classes子目录中。

我真的搞不清楚问题出在哪里。

JUnit的java文件位于src/main/java中,并且命名正确(*Test.java)。

我是否必须始终通过Maven编译和运行它们?为什么当我想要运行它们时Eclipse不编译这些文件呢?(有趣的是,有时它会。有时一切都工作得很完美。)


我在将Eclipse STS和AspectJ插件升级到最新版本后,遇到了完全相同的问题。 - Adam Gent
我也遇到了同样的问题。之前升级过,而且一直都运行良好。 - tcurdt
2
按照惯例,测试类应该放在/src/test/java而不是/src/main/java - Jens Piegsa
11个回答

89
我也曾经遇到过在 STS Eclipse(Spring 开发版本)、m2e 和 JUnit 中出现的同样问题。解决方法是将 src/test/java 的输出文件夹设置为 target/test-classes
  1. 在 Package Explorer 中右键点击 src/test/java 文件夹
  2. 选择Build Path -> Configure Output Folder
  3. 输入 target/test-classes, 点击 OK
现在测试类中的更改已被正确编译,您应该能够在 Eclipse 中运行 JUnit 测试。
问题在于 Eclipse 将单元测试编译到默认的输出文件夹 target/classes 中,而 JUnit 插件则从 test-classes 中正确地尝试运行它们。
这个问题有一些重复的提问:

13
为了自动获得相同的结果,请右键单击项目,选择Maven->更新项目配置... - paulcm
@paulcm:感谢您的提示!当我手动更新pom.xml、导入项目或仅打开一个项目时,“更新项目配置”似乎可以解决Eclipse方面的许多问题。 - apa64
正如 @paulcm 所说的一样 http://blog.xemantic.com/2008/06/maven-integration-for-eclipse-and.html - Miguel
那解决了我的问题。多年后它仍然存在。 - Procrastinator

6
除了下面的答案之外,您还应该右键单击src/test/java文件夹,选择Build Path -> Configure Output Folder,在target/test-classes中输入并点击OK。同时,您应该检查确保您的构建器设置正确,方法是右键单击项目并转到属性-> Builder。如果发现您的构建器丢失,则需要安装一个。在我的情况下,maven项目有一个AspectJ依赖项,当我使用Maven Eclipse插件构建Eclipse项目时,默认情况下会寻找AspectJ构建器。我安装了AspectJ开发工具,解决了问题。希望这可以帮助您!

3
“下面的答案”在基于投票排名的平台上并不真正有效,“该答案”在动态多答案平台上也不真正有效。 - Kissaki
谢谢。我今天升级到Eclipse Luna,由于同样的原因遇到了这个确切的问题。我安装了Luna版的AJDT开发版本(从http://download.eclipse.org/tools/ajdt/44/dev/update/),现在我的项目可以在Eclipse中构建了。 - Spencer

4
你面临的问题最可能的解释是 src/test/java 的输出文件夹配置不正确。
不要手动 修复此配置, 你可以让 m2eclipse 为你解决这个问题:只需右键单击项目,然后选择 Maven > Update Project

太晚了,但这个选项对我有效。 - Tim

2
另外一个要点是:JUnit测试类应该放在src/test/java目录下,而不是src/main/java目录下。否则,它们不会被Maven正确地识别为测试类,并且它们将被包含在打包的jar文件中而不是测试jar文件中。

1
请检查您的pom.xml中可以配置的“testSourceDirectory”路径。然后,将文件夹(在“testSourceDirectory”路径中配置)添加到eclipse构建路径中。
请在下面的pom.xml示例中找到“testSourceDirectory”。
<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>

1
我遇到了同样的问题。尝试了上述配置输出文件夹和Maven>更新项目的建议,但都没有起作用。最后也将我的testOutputDirectory更改为“build/classes”,现在单元测试已经被执行了。
最终找到了问题的原因。在我的pom中,我们还配置了maven编译器插件,如下所示。
        <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配置不需要,并且是上述问题的原因。删除此标签后,junit将被编译到build>testclasses文件夹中,并在maven构建期间运行。耶!:)


1
请确保您的项目图标上没有感叹号!在我的情况下,我忽略了项目图标上有一个感叹号,如下所示:项目图标上的感叹号 打开"Markers"视图,然后根据提示解决问题。"Markers"视图显示什么 在我调用"mvn clean test"之后,junit测试类可以成功执行,因为它们没有引用"Markers"视图中警告的不可读取的jar文件。因此,很容易忽略它。

我遇到了一个感叹号。在Eclipse的错误视图中,它说我缺少一个源文件夹/src/test/resources和“在构建路径错误被解决之前无法构建项目”。创建了这个文件夹后,代码再次被编译。 - Nils Rommelfanger

1

对于从事Java-Scala混合项目的人来说,这是需要注意的事项。 即使按照下面所示的方式进行了配置,

<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>

通过执行 Maven > Update Project,Eclipse会遵循项目中src/test/java文件夹的输出目录,但不适用于src/test/scala文件夹。(您可以右键点击特定源文件夹并选择Build Path > Configure Output Folder...来找到指定的pom文件中的位置,但是这只适用于前者,而不适用于后者。)
对于使用m2e和scala的情况,这已经是一个已知的bug,如http://scala-ide.org/docs/tutorials/m2eclipse/中所述。

警告

截至2013年3月,有一个bug导致src/main/scala和src/test/scala都使用默认的输出文件夹(target/classes)。当构建测试时,这可能会让人感到困惑,因为它们的类文件不会以target/test-classes结尾,就像在命令行上构建时一样。您可以通过手动更改src/test/scala的输出文件夹来解决此问题。


0

我的问题不是JUnit插件,而是我的pom.xml配置。

在查看了这个问题的所有答案后,@Gulats的答案给我暗示应该尝试在maven-compiler-plugin部分设置一个testOutputDirectory,并且这解决了我的问题:

<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
尽管我尝试了上述所有解决方案,但我的问题仍未得到解决。然而,通过修改文件权限,我成功地解决了这个问题,这也是问题的根本原因。
使用超级用户特权和“chown”命令,将目录及其内容递归地更改为您的用户名和组“sudo”的所有权。
sudo chown $USER:USERGROUP -R ~/path


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接