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

Posted

技术标签:

【中文标题】Eclipse/Maven:运行 JUnit 测试时未编译它们【英文标题】:Eclipse/Maven: JUnit tests not compiled when running them 【发布时间】:2011-08-30 13:40:27 【问题描述】:

我正在使用 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 插件升级到最新版本之后,我遇到了同样的问题。 这里有同样的问题。也升级了,之前运行良好。 按照惯例,测试类转到/src/test/java,而不是/src/main/java ... 【参考方案1】:

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

    右键单击 Package Explorer 中的 src/test/java 文件夹 选择构建路径 -> 配置输出文件夹 输入target/test-classes,点击确定

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

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

这个问题有几个重复:

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

【讨论】:

要自动获得相同的结果,请右键单击项目,然后选择 Maven->Update Project Configuration... @paulcm:感谢您的提示!当我手动更新 pom.xml、导入项目或刚刚打开一个项目时,“更新项目配置”似乎解决了 Eclipse 方面的许多问题。 正如@paulcm blog.xemantic.com/2008/06/…所说的 这解决了我的问题。几年后它仍然存在。【参考方案2】:

除了下面的答案

    右键单击 src/test/java 文件夹 选择构建路径 -> 配置输出文件夹 输入目标/测试类,点击确定

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

希望这会有所帮助!

【讨论】:

“the answer below”在基于投票排名的平台上并不能真正起作用,而“the answer”也不能真正起作用一个动态的多答案平台。 谢谢。我今天升级到 Eclipse Luna,并且出于同样的原因遇到了这个确切的问题。我为 Luna 安装了开发版 AJDT(来自 download.eclipse.org/tools/ajdt/44/dev/update),我的项目现在使用 Eclipse 构建。【参考方案3】:

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

除了fixing this configuration manually,您可以让 m2eclipse 为您解决这个问题:只需右键单击项目并选择 Maven > 更新项目

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

我遇到了同样的问题。尝试了上述配置输出文件夹和 Maven>Update Project 的建议,但均未成功。最后将我的 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 构建期间运行。 Yippee :)

【讨论】:

【参考方案6】:

请检查“testSourceDirectory”路径,可以在您的 pom.xml。然后,将文件夹(在“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>

【讨论】:

【参考方案7】:

确保您的项目图标上有感叹号!就我而言,我忽略了有一个感叹号,例如: exclamation point on project icon

打开“标记”透视图,然后根据提示解决问题。 what the "Markers" perspective show

在我调用“mvn clean test”后,junit 测试类可以成功执行,因为它们没有引用在“Markers”透视图中警告的不可读 jar。因此,很容易忽略它..

【讨论】:

我有一个感叹号。 eclipse 中的错误视图说我缺少源文件夹 /src/test/resources 并且“在解决构建路径错误之前无法构建项目”。创建文件夹后,代码再次编译。【参考方案8】:

对于从事 java-scala mix 项目的人来说,这是需要注意的。 即使按照如下所示的方式进行了配置,

<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 > 更新项目,eclipse 尊重项目中 src/test/java 文件夹的输出目录,但是,不适用于 src/test/scala 文件夹。 (您可以通过右键单击特定源文件夹并选择 Build Path > Configure Output Folder... 来解决这个问题,这应该显示前一种情况下 pom 中指定的位置,但是,不适用于后一种情况。

这已经是使用 scala 和 m2e 的已知错误,如下所述:http://scala-ide.org/docs/tutorials/m2eclipse/

警告

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

【讨论】:

【参考方案9】:

Eclipse 不希望其他任何东西与类文件混在一起。它假定如果您没有在 eclipse 中编辑文件,它没有更改并且不需要编译。我认为这个问题源于 eclipse 和 maven 共享一个输出目录。如果我的 mvn 构建失败,我经常看到这种情况,它将删除类文件作为干净但未编译的新文件的一部分。我认为最好的解决方案是为 mvn 和 eclipse 分别构建目录,但我从来没有研究过这个。

【讨论】:

我已经看到你在说什么,但不是这样。它就像 Eclipse 不会重新加载 JUnit 的类。我认为这是一个 AspectJ 问题而不是 Maven 问题。【参考方案10】:

我的问题不是 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>

【讨论】:

以上是关于Eclipse/Maven:运行 JUnit 测试时未编译它们的主要内容,如果未能解决你的问题,请参考以下文章

Java web项目

将Eclipse Maven项目 导入 IDEA 步骤 成功运行 已测试!~LC

eclipse maven程序怎么运行

windows : Jmeter自动化测试-eclipse+maven+jmeter

从另一个 JUnit 测试类运行 JUnit 测试类

Eclipse - 未找到测试运行程序“JUNIT 4”的测试