Eclipse/Maven: JUnit 测试在运行时没有被编译

我正在使用 Maven 和 Eclipse (m2eclipseplugin)进行一个项目,我在 JUnit 测试中遇到了一些问题:

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

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

我真的不知道哪里出了问题。

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

我必须总是通过 Maven 编译和运行它们吗?当我想运行这些文件时,Eclipse 为什么不编译它们?(有趣的是,有时候确实如此。有时候一切都很完美。)

49910 次浏览

Eclipse 不希望其他任何东西对类文件造成干扰。它假设如果您没有在 eclipse 中编辑文件,那么它就不会改变,也不需要编译。我认为这个问题源于 eclipse 和 maven 共享一个输出目录。我经常看到这种情况,如果我的 mvn 构建失败,它将删除类文件作为清理的一部分,但没有编译的新文件。我认为最好的解决方案是为 mvn 和 eclipse 分别构建目录,但我从未研究过这个问题。

还有一点: JUnit 测试类应该在 src/test/java 中,而不是在 src/main/java 中,否则 Maven 不会正确地将它们作为测试类检测到,并且它们将包含在打包的 jar 中,而不会包含在测试 jar 中。

我在 STSEclipse (Spring 开发变体)、 m2e 和 JUnit 上遇到了同样的问题。解决方案是将 src/test/java的输出文件夹设置为 target/test-classes:

  1. 右键单击“软件包资源管理器”中的 src/test/java文件夹
  2. 选择 构建路径-> 配置输出文件夹
  3. 输入 target/test-classes,单击 好的

现在测试类中的更改已经被正确编译,您应该能够在 Eclipse 中运行 JUnit 测试。

问题是 Eclipse 将单元测试编译到默认的输出文件夹 target/classes,而 JUnit 插件正确地尝试从 test-classes运行它们。

这个问题有几个副本:

除了下面的答案

  1. 右键单击 src/test/java 文件夹
  2. 选择 Build Path-> Configure Output Folder
  3. 输入目标/测试类,单击 OK

您应该通过右键单击项目并转到 属性-> 生成器来检查生成器是否正确设置。如果发现缺少生成器,则需要安装一个。在我的例子中,Maven 项目有一个 AspectJ 依赖项,当我使用 Maven Eclipse 插件来构建我的 Eclipse 项目时,默认情况下它正在寻找一个 AspectJ 构建器。我安装了 AspectJ 开发工具,它解决了这个问题。

希望这个能帮上忙!

对于您所面临的问题,最可能的解释是 src/test/java的输出文件夹配置不正确。

您可以让 m2eclipsefix 来替代 手动修复此配置: 只需右键单击项目并选择 美芬 > 更新计划

我也面临同样的问题。尝试上面的建议配置输出文件夹 & Maven > 更新项目,但都不奏效。最后,我还将 testOutputDirectory 更改为“ build/classes”,现在单元测试正在被拾取和执行。

最后找到了问题的原因

        <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 构建期间运行。耶!)

请检查“ 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>

确保你的项目图标上有任何叹号!就我而言,我忽略了这样一个叹号: 叹号项目图标

打开“ Markers”透视图,然后根据提示解决问题。 “马克斯”的观点表明了什么

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

对于从事 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>

并执行 美芬 > 更新计划操作时,Eclipse 会尊重项目中 src/test/java 文件夹的输出目录,但不会尊重 src/test/scala 文件夹的输出目录。(您可以通过右键单击特定的源文件夹并选择 生成路径 > 配置输出文件夹..。来解决这个问题,它应该显示前一种情况下在 pom 中指定的位置,而不是后一种情况。

这已经是一个已知的 bug,用于在 m2e 中使用 scala,正如这里提到的: http://scala-ide.org/docs/tutorials/m2eclipse/

警告

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

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

在回顾了这个问题的所有答案之后,@Gulats 的回答暗示我应该尝试在 maven 编译器插件部分设置一个 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>