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


72

我正在使用Maven和Eclipse(m2eclipse插件)进行项目。我在JUnit测试中遇到问题:

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

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

我真的不知道怎么了。

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

我是否必须始终通过Maven编译并运行它们?当我想运行文件时,为什么Eclipse不编译文件?(有趣的是,有时会。有时一切正常。)


我在此完全相同的问题后,我升级我的Eclipse STS和AspectJ插件到latests。
亚当·根特

这里同样的问题。还升级了,它之前工作正常。
tcurdt 2012年

2
按照惯例,考试班要上/src/test/java,而不是/src/main/java……
Jens Piegsa

Answers:


87

我对STS Eclipse(Spring开发版本),m2e和JUnit遇到了相同的问题。解决的办法是设置输出文件夹src/test/javatarget/test-classes

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

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

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

这个问题有一些重复之处:


12
要自动获得相同的结果,请右键单击该项目,然后选择Maven-> Update Project Configuration ...
paulcm

@paulcm:谢谢小费!当我手动更新pom.xml,导入一个项目或只是打开一个项目时,“更新项目配置”似乎在Eclipse方面解决了许多问题。
apa64 2012年


那解决了我的问题。它也持续多年。
拖延时间为

6

除了下面的答案

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

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

希望这可以帮助!


3
“答案下面”并未真正发挥作用投票秩为基础的平台,而“回答”在动态多答案要么平台工作并没有真正的。
Kissaki

谢谢。我今天升级到Eclipse Luna,出于相同的原因遇到了这个确切的问题。我安装了适用于Luna的AJDT的开发版本(来自download.eclipse.org/tools/ajdt/44/dev/update),我的项目现在使用Eclipse构建。
Spencer

2

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


2

您面临的问题的最可能解释是 src/test/java是未正确配置。

您可以让m2eclipse为您解决此问题,而不是手动修复此配置:只需右键单击该项目,然后选择Maven> Update Project


1

我遇到了同样的问题。尝试了以上有关配置输出文件夹和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 :)


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

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

打开“标记”透视图,然后根据提示对问题进行故障排除。 “标记”透视图显示了什么

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


我有一个感叹号。eclipse中的错误视图表示我缺少源文件夹/ src / test / resources,并且“在解决构建路径错误之前,无法构建项目”。创建文件夹后,代码再次被编译。
尼尔斯·希蒙德

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文件夹。(您可以通过右键单击特定的源文件夹并选择“构建路径”>“配置输出文件夹...”来解决此问题,对于前一种情况,它应该显示在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分别设置构建目录,但是我从来没有研究过。


我已经看过您在说什么,但不是。就像Eclipse一样,它不会为JUnit重新加载类。我认为这是一个AspectJ问题,而不是Maven问题。
亚当·根特

0

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

在查看了该问题的所有答案之后,@ Gulats的答案暗示我应该尝试testOutputDirectory在我的maven-compiler-plugin部分中设置a ,从而达到了目的:

<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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.