【问题标题】:JUnit: NoClassDefFoundError: org/junit/runner/manipulation/FilterJUnit:NoClassDefFoundError:org/junit/runner/manipulation/Filter
【发布时间】:2021-04-02 00:28:50
【问题描述】:

当我尝试运行一些单元测试时,出现以下错误:

java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadTestLoaderClass(RemoteTestRunner.java:320)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createRawTestLoader(RemoteTestRunner.java:310)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createLoader(RemoteTestRunner.java:305)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.defaultInit(RemoteTestRunner.java:283)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.init(RemoteTestRunner.java:207)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:191)

不得不提一下,junit-4.11.jar 已添加到项目构建路径中。有什么想法吗?

编辑:我(Gábor Lipták)已经阅读了另一个问题,这个问题应该是重复的。 这不是重复的。如果有人在 Eclipse 中将 Gradle Buildship 作为构建插件,如果您错误地将测试类放入 main/resorces 而不是test/resources。在生成运行配置时,Buildship 似乎负责测试与编译类路径。请参阅下面我的.classpath 文件的以下 sn-ps 作为证据:

<classpathentry kind="src" output="bin/main" path="src/main/resources">
    <attributes>
        <attribute name="gradle_scope" value="main"/>
        <attribute name="gradle_used_by_scope" value="main,test"/>
    </attributes>
</classpathentry>

<classpathentry kind="src" output="bin/test" path="src/test/resources">
    <attributes>
        <attribute name="gradle_scope" value="test"/>
        <attribute name="gradle_used_by_scope" value="test"/>
    </attributes>
</classpathentry>

【问题讨论】:

  • 不确定这是否完全重复,错误引用了不同的类,并且未在其他页面上提供解决方案。
  • 这不应被标记为重复,因为在另一个问题中错误消息清楚地表明缺少 hamcrest,而在这个问题中,错误消息告诉我们无法找到 Filter 类
  • 我猜你的项目不是基于 maven 的。运行 -> 运行配置 打开选项卡“类路径”,单击左侧的“高级...”按钮 选择“添加库”-> Junit 然后,在“用户条目”下,您将看到 Junit 库。

标签: java junit


【解决方案1】:

即使我也面临同样的问题,所以请尝试以下步骤 -

  1. 在包资源管理器中右键单击项目,然后单击属性。
  2. 单击“库”选项卡。
  3. 单击添加库按钮。
  4. 选择 JUnit 并单击下一步。
  5. 选择 JUnit 4(我正在使用)。
  6. 点击完成。
  7. 现在右键单击包含单元测试的文件并选择属性。
  8. 在运行/调试设置下,从该文件的启动配置中删除所有条目。点击确定。

希望您现在能够运行测试。

【讨论】:

  • 对我来说,第二部分主要是删除启动配置。 Junit 在 Eclipse 中的设置可能不同(单独的 lib 项目、maven 依赖项等)
  • 这对我不起作用 - 我的项目通过 gradle 获取 JUnit,而 unit-4.12.jar 位于包含 Filter 类的构建路径中。我认为这可能是一些奇怪的日食问题。
  • 对我来说这是用户错误:我将测试类放在 src/main/java 而不是 src/test/java。
  • 对我来说,这是新添加的依赖项中的语法错误。我更正了组/工件名称,一切都回到了轨道。一开始并不明显。
  • 我认为第 8 步是最重要的,删除旧的运行配置为我解决了类似的问题
【解决方案2】:

此错误可能是由于将 JUnit 库添加到 Modulepath 而不是 Classpath。

在 Eclipse 中最左边的面板“Package Explorer”右键单击您的项目进入属性然后转到“Java Build Path”单击“Classpath”而不是“Modulepath”单击“Add Library...”然后 Junit。

【讨论】:

    【解决方案3】:

    在我的情况下,错误具有相同的堆栈跟踪,(以 java.lang.Class.forName0(Native Method) 结尾)但错误消息不同:

    java.lang.VerifyError: (class: org/junit/runner/manipulation/Alphanumeric, method: create signature: (Lorg/junit/runner/manipulation/Ordering$Context;)Lorg/junit/runner/manipulation/Ordering;) Wrong return type in function

    原因原来是我已将 JUnit 从 4.11 升级到 4.13.1,因为 GitHub 的“dependabot”在我的一些公共项目上建议这样做,甚至创建了可供我接受的合并请求,我想“当然,为什么不呢,怎么可能出问题?”结论:不要相信 GitHub 的dependabot。

    【讨论】:

      【解决方案4】:

      看起来这是 eclipse 的一个缺陷,请更新 eclipse 或基于 eclipse 的编辑器来修复这个问题。

      更多详情请参考这里 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=525844

      【讨论】:

        猜你喜欢
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 2017-10-07
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多