运行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个回答

149

这似乎是因为当您使用mvn clean compile编译时,只有源代码会被编译(我使用的是maven 3.1.0,所以不确定它是否一直表现出这种方式)。

如果您运行mvn test,则测试代码也将被编译,但是它会运行测试(如果您正在尝试通过Eclipse运行测试,则可能不是立即需要的)。解决这个问题的方法是,在每次执行mvn clean时,在Maven命令序列中添加test-compile。例如,您可以运行mvn clean compile test-compile


1
我曾经遇到过这种情况,slomek的答案起了作用,但后来又出现了同样的错误,所以我不得不再试一次。现在它又正常工作了,为了安全起见,您可能需要同时执行这两个操作。 - Roger
谢谢,它对我有用。但在我的情况下,在Eclipse中关闭并重新打开项目后,它没有起作用。 - Paramesh Korrakuti
简单来说,执行“mvn clean test-compile”命令,然后在Eclipse中运行您的Junit测试。这对我很有效。谢谢。 - Sreram Balasubramaniyan
如果那是一个Ant项目呢? - Abdul

120

我在测试过程中遇到了类似的问题,并且在网上找到一个解决方法:您需要进入项目属性中的 构建路径(Build Path),将Maven依赖项(Maven Dependencies)移动到JRE系统库(JRE System Library)上面。这对我有效。


1
谢谢,这解决了我的问题。实际测试时,当我尝试运行它时,出现了类未找到的错误。我认为在添加额外的mvn构建目标之前,这可能是一个更可取的第一步。 - Roger
9
这种方法在此帖子中通过截图进行了说明(如果@slomek的回答中步骤不够清晰)。 - nhylated
2
我无法将Maven管理的依赖项移动到Eclipse Mars 2中的JRE系统库上方,但我可以右键单击项目,然后转到“属性”->“构建器”,然后将Maven项目构建器移到Java构建器上方,这对我有用。 - xorcus
我尝试了以上所有方法,但都没有成功。我也无法移动Maven依赖项到JRE系统库下方,因为它们在“Libraries”选项卡下。然后我进入“Build Path -> Order & Export”,并成功将Maven依赖项移到JRE系统库上方。接着我构建了项目并运行了Maven安装,测试成功通过。 - Megan
在我的情况下,更改Maven依赖项的构建路径配置顺序对我没有起作用。我从运行配置中更改了它的顺序。这样做是有效的。有关详细步骤,请查看我的答案。 - Shadyar

33

我也遇到了同样的问题,使用@slomek的回答后问题得到了解决,但之后问题又出现了。

最终我通过将我的项目输出文件夹添加到JUnit测试运行配置中来解决了这个问题。步骤如下:

  • 项目属性 -> Java Build Path -> 默认输出文件夹 找到你的项目输出文件夹
    • 通常情况下是 <project-folder>/bin
  • 进入 运行 -> 运行配置...
  • 点击单元测试的运行配置并点击 Classpath 标签页
  • User Entries 下明确添加你的项目输出文件夹 - 即使该项目已经包含在其中
    • 点击 高级 -> 添加文件夹 来添加输出文件夹

这个问题可能是由于Eclipse中的奇怪项目设置引起的 - 例如导入为单个项目/文件夹的嵌套maven项目的源文件夹(至少我的项目就是这样设置的)。


1
非常感谢,我遇到了这个问题。你的修复方法对我有用,前两个方法都不行。已点赞。 - rbncrthms
1
太棒了!我已经为此苦恼了很长时间。谢谢! - RayCh
非常感谢。我自己永远无法解决这个问题。我的是一个Ant项目,你的解决方案有效。 - Mohit

18

如果这个问题只在Eclipse中出现,执行命令Project -> Clean...来清理选择的项目可能会有帮助。


谢谢 - 它对我真的有用 - JAVE EE Eclipse Gradlew - Abdeali Chandanwala
确保在清理时选择特定的项目,而不是全部清理。 - Ram

14

在尝试了一切办法但没有改善的情况下,我只需重启Eclipse即可解决问题。


11

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


这是我经常做的事情,它解决了问题。 - rslj

5
在我的情况中,我有一个错误的Maven目录结构。
正确的目录结构应该是: /src/test/java/ com.myproject.server.MyTest
在我修复这个问题后,一切都像魔术般地正常工作了。

3

在我的情况下,只有以下步骤能够帮助我解决这个问题:

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

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

2
似乎是编译问题。作为Maven测试运行项目,然后作为JUnit测试运行。

2
在我的情况下,通过构建路径配置更改Maven依赖项的顺序对我没有用。我从运行配置中更改了它的顺序。
按照以下步骤操作:
• 转到运行 -> 运行配置...
• 单击单元测试的运行配置,然后单击Classpath选项卡。
• 选中“使用临时JAR指定类路径”(以避免类路径长度限制)。
也许这就足够了,你应该尝试一下,所以按下运行按钮。如果不起作用,请再次按照所有先前的步骤操作,并在不按下运行按钮的情况下进行下一步。
• 在用户条目的子分支中将Maven依赖项移到您的项目或测试类之上。
• 单击运行按钮。

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