【问题标题】:Class Not Found Exception when running JUnit test运行 JUnit 测试时找不到类异常
【发布时间】:2012-07-08 00:37:35
【问题描述】:

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

【问题讨论】:

  • 在编译所有测试类后尝试运行mvn clean test
  • 你能检查一下 com.myproject.server.MyTest 是否在 bin 文件夹中吗?我的意思是如果由于编译或构建路径错误而未编译,您将收到此错误。
  • 你是在测试一个类还是整个项目?
  • 在我的情况下,使用 Maven 运行测试是可行的,但是如果我右键单击一个测试类并选择 Run As -> JUnit Test,它会报告 ClassNotFoundException。我通过右键单击项目并转到 Properties -> Builders 然后将 Maven Project Builder 移动到 Java Builder 上方来修复它

标签: java eclipse junit


【解决方案1】:

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

如果您运行mvn test,测试代码也会编译,但随后它会运行测试(如果您尝试通过 Eclipse 运行它们,这可能不会立即可取。)解决此问题的方法是添加每当您执行mvn clean 时,将test-compile 添加到您的Maven 命令序列。例如,您将运行mvn clean compile test-compile

【讨论】:

  • 我曾经发生过这种情况,斯洛梅克的回答有效,然后同样的错误再次发生,所以我也不得不尝试这个。它现在又可以正常工作了,所以为了安全起见,您可能需要同时执行这两项操作。
  • 谢谢,它对我有用。但就我而言,它直到关闭并在 Eclipse 中重新打开项目才起作用。
  • 简单地说,做一个'mvn clean test-compile',然后在eclipse中运行你的Junit测试。它对我有用。谢谢。
  • 如果那是一个蚂蚁项目怎么办
【解决方案2】:

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

【讨论】:

  • 谢谢这解决了我的问题。当我尝试运行它时,实际的测试是得到类未找到错误。我认为这可能是在添加额外的 mvn 构建目标之前最好的第一步。
  • 此方法在this 帖子中通过屏幕截图进行了描述(以防上面@slomek 的回答中不清楚步骤)
  • 我无法在 Eclipse Mars 2 中将 Maven 托管依赖项移动到 JRE 系统库上方,但我可以右键单击项目并转到属性 -> 构建器,然后将 Maven 项目构建器移动到 Java 构建器上方它对我有用。
  • 我尝试了以上所有方法,但没有成功,我也无法移动关于 JRE 系统库的 Maven 依赖项,但它位于库选项卡下。然后我去了 Build Path -> Order & Export -> as 能够将 Maven Dependencies 移动到 JRE System 库之上。然后我构建了项目并运行了一个 Maven 安装,然后测试运行成功。
  • 就我而言,从构建路径配置更改 Maven 依赖项的顺序对我不起作用。我从运行配置更改了它的顺序。有效。对于这些步骤,请阅读我的答案。
【解决方案3】:

我遇到了同样的问题,我可以使用@slomek 的answer 修复它,但之后问题又出现了。

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

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

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

【讨论】:

  • 非常感谢;我有这个问题。你的修复对我有用;前两名没有。投票赞成。
  • 绝对精彩!多年来一直在为此挠头。谢谢!
  • 非常感谢。我自己永远无法解决这个问题。我的是一个 Ant 项目,但您的解决方案有效。
【解决方案4】:

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

【讨论】:

  • 谢谢 - 它实际上对我有用 - JAVE EE eclipse gradlew
  • 确保我们在清理时选择特定项目,而不是全部。
【解决方案5】:

在这里尝试了一切都没有改善后,我通过重新启动 Eclipse 解决了我的问题

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 这是我一直在做的事情,它解决了问题..
    【解决方案7】:

    在我的例子中,我有一个错误的 Maven 目录结构。

    应该是这样的:

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

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

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

      • 谢谢!!只有这个帮助了我!!
      【解决方案9】:

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

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

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

      希望这些有所帮助。

      【讨论】:

      • 请注意...这样做需要您重建环境。因此,虽然它可以解决,但请注意您将要做什么......
      【解决方案10】:

      之前,在这种情况下,我总是执行 mvn eclipse:eclipse 并重新启动我的 Eclipse 并且它工作正常。迁移到 GIT 后,它不再为我工作,这有点奇怪。

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

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

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

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

      Eclipse ->Windows ->类路径变量 ->New->[名称:Junit_test_cases_cp |路径:]->确定 然后去 Eclipse->运行->运行配置->JUnit->选择mytest->在类路径选项卡下->选择用户条目->高级->添加类路径变量->选择Junit_test_cases_cp->ok->应用->运行

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

          这些步骤对我有用。

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

          【讨论】:

            【解决方案13】:

            1- mvn eclipse:eclipse

            2-项目清理所有项目

            3-重启

            【讨论】:

              【解决方案14】:

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

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

              【讨论】:

                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

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

                  这个 sn-p 来自一个 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 复制到 JUnit 正在查找类的 bin 目录中。 ClassNotFoundException 只是重命名两个文件之一就消失了。

                  【讨论】:

                    【解决方案17】:

                    NoClassDefFoundError 确实意味着它无法初始化类。它与查找课程无关。在空字符串上调用 trim() 时出现此错误。

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

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

                    【讨论】:

                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

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

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

                        【讨论】:

                          【解决方案20】:

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

                          例如

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

                          【讨论】:

                            【解决方案21】:

                            对我来说,我不得不将项目 x/src/test/java/ 放在“java build path”中“order and export”的底部

                            【讨论】:

                              【解决方案22】:

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

                              【讨论】:

                                【解决方案23】:

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

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

                                【讨论】:

                                  【解决方案24】:

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

                                  【讨论】:

                                    【解决方案25】:

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

                                    【讨论】:

                                    • java.lang.ClassNotFoundException 在类已经编译但由于类路径设置不正确而在运行时出现。
                                    猜你喜欢
                                    • 1970-01-01
                                    • 2017-08-30
                                    • 2011-07-25
                                    • 2011-03-22
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2014-08-04
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多