运行JUnit测试时出现“类未找到异常”

143

我在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)

虽然我使用的是Maven,JUnit库已经在POM依赖中,但我尝试将JUnit库添加到类路径中。

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


13
运行一次 mvn clean test 命令,它将编译所有测试类。 - jmj
1
请问您能否检查一下 com.myproject.server.MyTest 是否在 bin 文件夹中?我的意思是,如果由于编译或构建路径错误而未编译,则会出现此错误。 - vikas
你是在测试一个类还是整个项目? - Doszi89
可能是Eclipse - java.lang.ClassNotFoundException的重复问题。 - Amos M. Carpenter
2
在我的情况下,使用Maven运行测试是有效的,但如果我右键单击测试类并选择“Run As -> JUnit Test”,它会报告ClassNotFoundException。我通过右键单击项目并转到“属性->构建器”,然后将Maven项目构建器移动到Java构建器之上来解决这个问题。 - xorcus
从其他答案(通过清理/重建、重新启动Eclipse、进行一些虚拟更改、删除.metadata文件夹、更改类路径项的顺序、恢复默认值等解决)和我的经验来看,这是Eclipse中某种竞争条件错误,即使在2023年也是如此。在我的情况下,它找不到一个资源文件:java.io.FileNotFoundException: class path resource [foo/appStuff.xml] cannot be opened because it does not exist 然后在摆弄了一番之后,它突然开始工作了。使用与之前相同的设置。 - David Balažic
25个回答

1

NoClassDefFoundError实际上意味着它无法初始化类。它与查找类没有任何关系。当在null字符串上调用trim()时,我遇到了这个错误。

JUnit不会显示NullPointerException。通常情况下,该字符串不为null,因为我从一个不可用于测试的属性文件中获取该字符串。

我的建议是从类中删除部分内容,直到您的测试开始通过为止。然后,您可以确定哪一行正在产生错误。


1
在此之前,我总是运行 mvn eclipse:eclipse 命令并重新启动 Eclipse,这样就可以正常工作了。但是迁移到 GIT 后,它对我来说停止工作了,这有点奇怪。
基本问题在于 Eclipse 先生找不到编译后的类。 然后,我将输出文件夹设置为 Project/target/test-classes,默认情况下由 mvn clean install 生成,而且没有跳过测试,并采用以下解决方法:
选项1:为每个测试案例设置类路径
Eclipse ->Run ->Run Configurations ->under JUnit->select mytest -> under classpath tab->Select User Entries->Advanced->Add Folder -> Select ->Apply->Run
选项2:创建类路径变量并将其包含在所有测试案例的类路径中

Eclipse -> Windows -> Classpath Variables -> New -> [Name: Junit_test_cases_cp | path:] -> ok 然后转到 Eclipse -> Run -> Run Configurations -> JUnit -> 选择 mytest -> 在 classpath 标签下 -> 选择用户条目 -> 高级 -> 添加classpath变量 -> 选择Junit_test_cases_cp -> ok -> 应用 -> 运行

在尝试了所有在线建议之后,这是目前唯一有效的方法。


1
我在调试Junits时遇到了与Eclipse Helios类似的问题。我的问题有点不同,因为我能够成功运行Junits,但是在调试相同的JUNIT时出现ClassNotFoundException。
我尝试了Stackoverflow.com和其他论坛中提供的各种不同的解决方案,但是似乎没有任何解决方法。在为这些问题苦恼了将近两天后,我终于找到了解决方法。
如果没有任何解决方案可用,请删除工作区中创建的.metadata文件夹。这会导致额外的导入项目和所有已完成的配置开销,但这些肯定会解决这些问题。
希望这些有所帮助。

作为一条注意事项...这样做将需要您重建您的环境。因此,虽然它可能是解决方案,但请注意您即将要做的事情... - Bob

1

对我来说,我必须将项目x/src/test/java/放在“Java构建路径”中“排序和导出”的底部

enter image description here


0

我在一个带有两个资源目录的测试 SourceSet 的 Gradle 项目中遇到了同样的问题。

这段代码片段来自于 main-module.gradle 文件,并向测试 SourceSet 添加了一个资源目录:

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

这样做后,我有两个与项目main-module的测试SourceSet相关的资源目录:

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

我发现如果我在这两个源目录中都有同名文件,那么在处理资源阶段会出错。结果,没有开始编译,因此没有将.class文件复制到bin目录中,JUnit正在查找这些类。通过重命名其中一个文件,ClassNotFoundException就消失了。


0
值得一提的是,如果您正在使用eGit,并且由于例如Clover之类的测试覆盖工具而更新了您的类路径,有时会出现清理问题,无法完全删除

0

0

1- mvn eclipse:eclipse

2- 清理所有项目

3- 重新启动


0

这些步骤对我有效。

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

0

这也可能是由于“[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?”引起的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接