运行JUnit测试时未找到类异常


117

在Eclipse中运行JUnit测试时出现此错误:

Class not found com.myproject.server.MyTest
java.lang.ClassNotFoundException: com.myproject.server.MyTest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

JUnit尽管我正在使用maven,但我尝试在类路径中添加库,而JUnit库位于POM依赖项中。

我已经尝试清理项目,并使用Eclipse的JUnit插件创建了一个新的JUnit测试用例,但仍然遇到相同的错误。


10
尝试运行mvn clean test一次,它将编译所有测试类
Jigar Joshi

1
您可以检查bin文件夹中是否有com.myproject.server.MyTest吗?我的意思是,如果由于编译或构建路径错误而未进行编译,则会收到此错误。
vikas 2012年

您要测试一个班级还是整个项目?
Doszi89


1
就我而言,使用Maven运行测试是可行的,但是如果我右键单击测试类并选择Run As-> JUnit Test,它将报告ClassNotFoundException。我固定它通过右键单击该项目并转到属性- >建筑工地,然后移动Maven项目生成器时,Java Builder以上
xorcus

Answers:


120

出现这种情况的原因是,在使用时只有源代码正在编译mvn clean compile(我使用的是maven 3.1.0,因此我不确定它是否始终如此)。

如果运行mvn test,则测试代码也将编译,但随后它将运行测试(如果尝试通过Eclipse运行测试,则可能不是立即理想的。)解决方法是在test-compile任何时候添加到Maven命令序列中你做一个mvn clean。例如,您将运行mvn clean compile test-compile


1
我曾经发生过一次,并且slomek的答案起作用了,然后再次发生了同样的错误,所以我也必须尝试一下。现在它可以再次正常工作,因此为了安全起见,您可能需要同时做这两个事情。
罗杰

谢谢,它为我工作。但就我而言,它直到关闭并重新打开该项目才起作用。
Paramesh Korrakuti 2015年

简而言之,执行“ mvn clean test-compile”,然后在Eclipse中运行Junit测试。它为我工作。谢谢。
斯雷姆

103

我在测试中遇到了类似的问题,并且在Web上的某个地方发现,必须转到项目属性中的“ 构建路径”,然后将Maven依赖项移至JRE系统库上方。这似乎对我有用。


1
谢谢,这解决了我的问题。实际的测试是在尝试运行该类时出现类未找到错误。我认为在添加额外的mvn构建目标之前,这可能是更可取的第一步。
罗杰

8
这篇文章中的屏幕截图介绍了此方法(以防上述步骤中@slomek的答案不清楚的步骤)
2014年

2
我无法将Maven托管依赖项移至Eclipse Mars 2中的JRE系统库上方,但是我可以右键单击该项目并转到“属性”->“构建器”,然后将“ Maven项目构建器”移至Java Builder之上,它对我有用。
xorcus

我尝试了以上所有方法,但没有用,我也无法移动有关JRE系统库的Maven依赖关系,但这在“库”选项卡下。然后我转到Build Path-> Order&Export->,因为它能够将Maven依赖关系移至JRE System库之上。然后,我构建了该项目并运行了Maven安装,然后测试成功运行了。
梅根

22

我遇到了同样的问题,我可以使用@slomek的答案来解决它,但此后又浮出水面。

最后,我通过将项目的输出文件夹添加到JUnit测试的运行配置中来对其进行修复。步骤如下:

  • 从以下位置找到项目的输出文件夹 Project properties -> Java Build Path -> Default output folder
    • 通常这是 <project-folder>/bin
  • Run -> Run Configurations...
  • 单击单元测试的运行配置,然后单击Classpath选项卡
  • 显式添加项目的输出文件夹User Entries--即使项目已经包含在其中
    • 单击Advanced -> Add folder添加输出文件夹

这个问题可能是由于Eclipse中的项目设置怪异-例如,源文件夹中嵌套的maven项目作为单个项目/文件夹导入(至少是我的项目设置方式)。


非常感谢; 我有这个问题。您的修复对我有用;前两个没有。投票赞成。
davtom 2015年

绝对辉煌​​!在此问题上我已经摸了很久。谢谢!
RayCh



5

我通过运行Maven更新解决了我的问题。右键单击项目,然后单击项目> Maven>更新项目


3

就我而言,我的Maven目录结构错误。

应该是这样的:

/ src / test / java / com.myproject.server.MyTest

在我修复该问题之后-一切都像个魅力。


2

就我而言,只有后续步骤才能帮助我解决此问题:

  1. 项目->属性->运行/调试设置。
  2. 在“启动'.....'的配置”中,选择类/项目
  3. 编辑->类路径->“恢复默认条目”

谢谢!!只有这个帮助了我!
sumandas

1

以前,在这种情况下,我总是执行mvn eclipse:eclipse并重新启动Eclipse并成功运行。迁移到GIT后,它停止为我工作,这有点奇怪。

这里的基本问题是Eclipse先生找不到编译的类。然后,我将输出文件夹设置为Project / target / test-classes,这是默认情况下通过mvn clean install不跳过测试而生成的,并继续以下变通方法:

选项1:为每个测试用例设置类路径

Eclipse->运行->运行配置->在JUnit下->选择mytest->在类路径选项卡下->选择用户条目->高级->添加文件夹->选择->应用->运行

选项2:创建classpath变量并将其包含在所有测试用例的classpath中

Eclipse-> Windows-> Classpath变量-> New-> [名称:Junit_test_cases_cp | path:]-> ok然后转到Eclipse-> Run-> Run Configurations-> JUnit-> select mytest->在classpath选项卡下-> Select User Entries-> Advanced-> Add classpath variables-> Select Junit_test_cases_cp-> ok- >应用->运行

在网上尝试了所有建议后,这是当前对我唯一有效的方法。


1

对于带有两个资源目录的测试SourceSet的Gradle项目,我遇到了同样的问题。

此代码段来自main-module.gradle,并将资源目录添加到测试SourceSet中:

sourceSets {
    test {
        resources {
            srcDir('../other-module/src/test/resources')
        }
    }
}

这样做,我有两个资源目录与项目主模块的测试SourceSet有关:

../other-module/src/test/resources src / test / resources(相对于main-module文件夹,由Java插件自动添加)

我发现如果两个源目录中都有两个同名文件,则在过程资源阶段出现了问题。结果,没有编译开始,因此,没有.class复制到bin目录中,JUnit在该目录中查找类。仅重命名两个文件之一,ClassNotFoundException就消失了。


1

NoClassDefFoundError实际上意味着它无法初始化该类。它与找到班级无关。在null字符串上调用trim()时出现此错误。

JUnit不会显示NullPointerException。正常运行时,字符串不为null,因为我是从无法用于测试的属性文件中提取字符串的。

我的建议是从课程中删除部分内容,直到您的测试开始通过。然后,您可以确定出现错误的行。


0

我在调试Junits的Eclipse Helios中遇到了类似的问题。我的问题几乎没有什么不同,因为我能够成功运行Junits,但是当我在调试相同的JUNIT时遇到ClassNotFoundException时。

我尝试了Stackoverflow.com和其他论坛中可用的各种解决方案,但似乎没有任何效果。在花了将近两天时间解决这些问题之后,我终于找到了解决方案。

如果所有解决方案都不起作用,则只需删除在工作区中创建的.metadata文件夹。这将增加导入项目和完成的各种配置的额外开销,但是这些肯定会解决这些问题。

希望这些会有所帮助。


请注意,这样做将需要您重建环境。因此,尽管它可以解决问题,但请注意您将要做什么...
Bob

0

这些步骤对我有用。

  • 删除本地Maven存储库的内容。
  • 在命令行中运行mvn clean install。(cd到pom目录)。
  • 在Eclipse中构建项目。

0

1-MVN Eclipse:日食

2-项目清理所有项目

3-重启


0

值得一提的另一个答案是,如果您使用的是eGit,并且由于诸如Clover之类的测试覆盖率工具而使类路径得到更新,那么有时会出现清理故障,但无法完全删除其中的内容。 /path/to/git/repository/<project name>/bin/

本质上,我使用了Eclipse的“错误日志视图”,确定了清理工作中引起问题的原因,导航到源目录,然后手动删除了该<project name>/bin目录。完成后,我返回Eclipse并刷新(F5)我的项目,错误消失了。


0

检查您的项目是否作为Maven项目而不是作为常规Java项目打开。实际上是理所当然的,但这与您可能会错过它的原因完全相同。


0

也可能是由于“ [ERROR]在此环境中未提供编译器。也许您在JRE而不是JDK上运行?”


0

我曾经遇到过同样的问题。我通过删除外部JUnit jar依赖关系解决了该问题,该依赖关系是通过从Internet外部下载添加的。但是后来我去了Project-> properties-> build path-> add library-> junit->选择了版本(例如junit4)-> apply。

它会自动添加依赖项。它解决了我的问题。



0

看来编译问题。将项目作为Maven测试运行,然后作为JUnit测试运行。



0

请检查您是否已添加junit4作为依赖项。

例如

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

-5

可能是您忘记了将Main类Test Case类放在/ src / test / java中。检查一次。


1
当类已经编译但由于未正确设置类路径而在运行时出现java.lang.ClassNotFoundException。
Nitin Mahesh
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.