junit中的java.lang.NoClassDefFoundError


80

我在junit测试代码中的Java中收到此错误。我在网上查找,它说我需要在类路径中添加junit.jar。

在Eclipse中,我已将其添加到“项目属性”窗口的类路径中,但是仍然收到初始化错误。我该怎么办..?

这是错误的完整记录:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:32)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:41)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:31)
    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)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 25 more

1
根据错误缺少什么类?
BalusC,2010年

Answers:


104
  1. 在Package Explorer中右键单击您的项目>单击Properties
  2. 转到Java Build Path> Libraries选项卡
  3. 点击“添加库”按钮
  4. 选择JUnit
  5. 点击下一步。
  6. 在下拉按钮JUnit4或其他新版本中选择。
  7. 单击完成。
  8. 那好吧

这样做会在库中添加JUNIT,但现在它说无法解析

5
只需仔细检查您是否在类路径上也有Hamcrest库。当前版本的JUnit 4应该完全包含在内,但有时人们会拆分软件包。
Berin Loritsch 2010年

如果我使用的是Linux命令行,该如何进行?我在哪里添加这个罐子?
vipin8169 2014年

上面的步骤工作正常,并且从eclipse插件文件夹中提取了jar。但是,如果我们在配置构建路径中将junit jar文件添加为外部jar,它应该工作正常吗?它对我不起作用
Vineeth Bhaskaran,2016年

20
  1. Eclipse->顶部菜单->运行->运行配置
  2. 删除所有出现的测试。您的测试可能会显示为YourTest.Method_1()。也删除它。
  3. 重新运行。让Eclipse构建新的配置。

附录:我在本地创建了一个“用户库”,并将其添加到我的项目中

hamcrest-core-1.3.jar

junit-4.12.jar


11

如果您已经从JUnit网站下载了JUnit jar,但是却忘记了下载Hamcrest jar,则可能会发生同样的问题-两者都是必需的(说明要求同时下载这两个,但是我跳过了!糟糕!)


10

在Maven中使用时,将工件junit:junit从例如4.8.2更新到4.11。


1
这给我定了一个NoClassDefFoundError: org/junit...。caused by ClassNotFoundException: org.junit.runners.model.InitializationError我正在使用Junit 4.8。移至4.11可行。
亚历克斯(Alex)

6

在Eclipse上,我可以按照以下步骤解决上述问题:

右键单击要运行的测试文件, 选择运行方式->运行配置->选择类路径选项卡->选择引导项->选择高级->选择添加库->选择JUnit->下一步->从下拉菜单中选择JUnit4->完成

然后选择应用->运行



2

当错误表明缺少Filter类时,这些步骤对我有用(如在该错误复制的问题中报告的:JUnit:NoClassDefFoundError:org / junit / runner / manipulation / Filter):

  1. 确保在您的项目中仅对JUnit 4进行一次引用(我也删除了Maven性质,但不确定此步骤是否对解决问题有影响)
  2. 右键单击包含单元测试的文件,选择“属性”,然后在“运行/调试”设置下,从该文件的“启动配置”中删除所有条目。点击“应用”并关闭。
  3. 右键单击包含单元测试的项目,选择“属性”,然后在“运行/调试”设置下,从“启动配置”中删除所有涉及JUnit的条目。点击“应用”并关闭。
  4. 清理项目,然后运行测试。

感谢这些回答为我提供了此解决方案的提示:https : //stackoverflow.com/a/34067333/5538923https://stackoverflow.com/a/39987979/5538923)。


1

请尝试以下步骤:

  1. 转到项目的运行配置。在Classpath选项卡中,添加JUnit库。
  2. 重试相同的步骤。

它为我工作。


1

我遇到了同样的问题,问题出在我的测试类中的@ContextConfiguration中,我也正在加载servlet上下文,所以我只是进行了更改:

@ContextConfiguration(locations = { "classpath*:**\*-context.xml", "classpath*:**\*-config.xml" })

至:

@ContextConfiguration(locations = { "classpath:**\*-context.xml", "classpath:**\*-config.xml" })

就是这样。这样,我只能在测试路径中加载所有带有* -context.xml模式的文件。



1

原因是“ hamcrest-core” jar不在类路径中,因为它不是直接与junit jar一起提供的。因此,有两种方法可以解决此问题:

  1. 选择项目-> buildpath->添加库并选择junit(它包含junit和hamcrest-core)
  2. 从maven repo下载hamcrest-core并将其添加到您的类路径中。

1

将我的两分钱加到其他答案上。

检查您是否不是偶然通过src/main/java而不是通常的方式创建了测试类src/test/java。当您出于任何原因创建新的测试类并且可以忽略时,前者是Eclipse中的默认设置。可以这么简单。


1

就我而言,我将库添加到Modulepath而不是Classpath上。

仅当JUnit正确添加到Classpath时,它才有效。

在此处输入图片说明


0

如果在类路径中存在2个版本的hamcrest-library或hamcrest-core,也会出现此错误。

在pom文件中,您可以排除多余的版本,并且可以使用。




-1

如果您使用的Java版本不止一个,则可能会干扰您的程序。

我建议您下载JCreator。

完成后,单击“配置”,“选项”和“ JDK配置文件”。从列表中删除Java的旧版本。然后单击播放按钮。您的程序应出现。

如果不是,请按ctrl + alt + O,然后再次按播放按钮。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.