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 测试时未编译它们的主要内容,如果未能解决你的问题,请参考以下文章
将Eclipse Maven项目 导入 IDEA 步骤 成功运行 已测试!~LC