129

在 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 测试用例,但仍然遇到相同的错误。

4

25 回答 25

137

这似乎是因为在您使用时只有源代码在编译mvn clean compile(我使用的是 maven 3.1.0,所以我不确定它是否总是这样)。

如果你运行mvn test,测试代码也会编译,但是它会运行测试(如果你试图通过 Eclipse 运行它们,这可能不是立即需要的。)解决这个问题的方法是添加test-compile到你的 Maven 命令序列中你做一个mvn clean。例如,您将运行mvn clean compile test-compile.

于 2013-07-21T02:58:13.880 回答
116

我的测试遇到了类似的问题,并且在 Web 的某个地方发现,您必须转到项目属性中的Build Path并将Maven Dependencies移到JRE System Library之上。这似乎对我有用。

于 2012-11-14T09:05:33.277 回答
29

我遇到了同样的问题,我能够使用@slomek 的答案解决它,但之后问题又出现了。

我最终通过将我的项目的输出文件夹添加到 JUnit 测试的运行配置来修复它。步骤是:

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

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

于 2014-11-21T13:34:45.020 回答
18

如果此问题仅在 Eclipse 中发生,则在选定项目上执行命令 Project -> Clean... 可能会有所帮助。

于 2016-03-04T06:57:47.937 回答
11

在没有任何改进的情况下在这里尝试了一切之后,我通过重新启动 Eclipse 解决了我的问题

于 2015-09-28T07:40:22.207 回答
8

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

于 2019-09-30T19:47:42.023 回答
4

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

应该是这样的:

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

在我修好之后 - 一切都像魅力一样。

于 2015-10-06T15:47:43.310 回答
2

就我而言,只有接下来的步骤才能帮助我解决此问题:

  1. 项目-> 属性-> 运行/调试设置。
  2. 在“为'.....'启动配置”中选择类/项目
  3. 编辑->类路径->“恢复默认条目”
于 2016-06-01T13:37:19.613 回答
1

早些时候,在这种情况下,我总是做 mvneclipse:eclipse并重新启动我的 Eclipse 并且它工作。迁移到 GIT 后,它不再为我工作,这有点奇怪。

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

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

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

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

Eclipse ->Windows ->类路径变量 ->New->[名称:Junit_test_cases_cp | path : ]->ok 然后去 Eclipse->Run ->Run Configurations ->JUnit->select mytest ->under classpath tab ->Select User Entries->Advanced->Add classpath variables->Select Junit_test_cases_cp->ok- >应用->运行

在在线尝试所有建议后,这是目前唯一对我有用的东西。

于 2014-04-08T08:20:45.533 回答
1

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

我已经尝试过 Stackoverflow.com 和其他地方的论坛中提供的各种不同的解决方案,但似乎没有任何效果。在用这些问题敲了近两天之后,我终于找到了解决方案。

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

希望这些有所帮助。

于 2014-07-31T07:11:02.800 回答
1

就我而言,从构建路径配置更改 Maven 依赖项的顺序对我不起作用。我从运行配置更改了它的顺序。
遵循这些步骤:
• 转到 Run -> Run Configurations...
• 单击单元测试的运行配置,然后单击 Classpath 选项卡。
• 选中使用临时JAR 来指定类路径(以避免类路径长度限制)。
可能就足够了,您的测试有效。你应该试试,所以按下运行按钮。如果它不起作用。再次执行所有先前的步骤,并且不按“运行”按钮,转到下一步。
• 在用户条目的子分支中,将 Maven 依赖项移动到您的项目或测试类之上。
• 单击运行按钮。

于 2020-09-22T04:02:34.577 回答
0

这些步骤对我有用。

  • 删除本地 Maven 存储库的内容。
  • 在命令行中运行mvn clean install 。(cd 到 pom 目录)。
  • 在 Eclipse 中构建项目。
于 2015-03-03T10:10:45.190 回答
0

1- mvn 日食:日食

2-项目清理所有项目

3-重新启动

于 2015-04-09T11:56:50.733 回答
0

值得一提的另一个答案是,如果您使用的是 eGit,并且您的类路径会因为诸如 Clover 之类的测试覆盖工具而更新,有时会出现清理打嗝并没有完全删除/path/to/git/repository/<project name>/bin/

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

于 2017-05-04T14:32:27.313 回答
0

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

于 2017-09-18T21:15:46.987 回答
0

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

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

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

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

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

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

于 2018-05-18T09:50:26.117 回答
0

NoClassDefFoundError 真的意味着它不能初始化类。这与寻找课程无关。在空字符串上调用 trim() 时出现此错误。

JUnit 不会显示 NullPointerException。正常运行时字符串不为空,因为我从不可用于测试的属性文件中获取字符串。

我的建议是在你的测试开始通过之前从课堂上删除部分。然后你可以确定哪一行给出了错误。

于 2019-01-11T20:09:14.650 回答
0

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

于 2019-08-12T22:10:16.117 回答
0

对于不使用 maven 的项目:这对我有用https://ihategeek.wordpress.com/2012/04/18/eclipse-junit-test-class-not-found/

在 Order 底部添加 jre 和 project src 并在构建路径中导出

于 2019-10-11T18:57:31.900 回答
0

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

例如

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
于 2019-12-23T11:59:32.627 回答
0

For me I had to put the project x/src/test/java/ at the bottom of the "order and export" in the "java build path"

enter image description here

于 2020-11-26T13:57:15.490 回答
-1

检查您的项目是否作为 Maven 项目打开,而不仅仅是常规 Java 项目。实际上很简单,但这正是您可能会错过它的原因。

于 2017-07-07T10:07:29.833 回答
-1

我也遇到过同样的问题。我通过删除外部 JUnit jar 依赖项解决了这个问题,该依赖项是通过从 Internet 外部下载添加的。但是后来我去了项目->属性->构建路径->添加库->junit->选择了版本(ex junit4)->应用。

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

于 2019-04-16T10:48:22.000 回答
-1

进行一些虚拟更改并保存测试类可以解决问题。它将自动构建 .class

于 2019-06-27T06:51:56.253 回答
-6

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

于 2014-08-22T09:42:00.477 回答