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

问题描述 投票:68回答:10

我正在使用Maven和Eclipse(m2eclipse插件)开发一个项目。我遇到了JUnit测试的问题:

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

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

我真的无法弄清楚出了什么问题。

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

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

eclipse maven junit
10个回答
84
投票

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

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

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

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

这个问题有几个重复:


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>

5
投票

除了下面的答案

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

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

希望这可以帮助!


2
投票

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


2
投票

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

而不是fixing this configuration manually,您可以让m2eclipse为您修复此问题:只需右键单击该项目并选择Maven> Update Project。


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配置,这是上述问题的原因。删除此标记后,junits将被编译为build> testclasses文件夹,并且正在maven构建期间运行。 Yippee :)


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

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

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

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


1
投票

对于从事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> Update Project,eclipse尊重项目中src / test / java文件夹的输出目录,但不是src / test / scala文件夹。 (您可以通过右键单击特定的源文件夹并选择“构建路径”>“配置输出文件夹...”来解决此问题,该文件应显示前一种情况下pom中指定的位置,但不适用于后一种情况。

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

警告

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


0
投票

Eclipse并不期望任何其他东西可以破解类文件。它假设如果你没有在eclipse中编辑文件,它没有改变,也不需要编译。我认为问题源于eclipse和maven共享输出目录。我经常看到这个,如果我的mvn构建失败,它将删除类文件作为干净但未编译的新文件的一部分。我认为最好的解决方案是为mvn和eclipse设置单独的构建目录,但我从来没有考虑过这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.