junit单元测试报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

Posted 戒爱学Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了junit单元测试报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing相关的知识,希望对你有一定的参考价值。

今天在复习的时候对对一些知识点进行巩固,用到了junit-4.12.jar,手动导入jar包,然后运行然后报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing。刚开始我以为代码错了,看了看发现不是代码的问题,是导包的问题。然后查询了百度,发现了是版本的问题:
然后说换个低版本的就可以了,说换成4.10就可以了。测试了一下果然

查官网:JUnit now uses the latest version of Hamcrest. Thus, you can use all the available matchers and benefit from an improved assertThat which will now print the mismatch description from the matcher when an assertion fails.

junit.jar: Includes the Hamcrest classes. The simple all-in-one solution to get started quickly.Starting with version 4.11, Hamcrest is no longer included in this jar.
junit-dep.jar: Only includes the JUnit classes but not Hamcrest. Lets you use a different Hamcrest version.
注意黑色加下划线的部分 意思是4.11以上版本不在包含hamcrest。
所以现在有两个办法解决:

  1. junit版本降到4.10
  2. 导入hamcrest-core-1.3.jar

使用Junit单元测试报错“No runnable methods“

异常

使用Junit单元测试报错如下:

java.lang.Exception: No runnable methods

	at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)
	at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
	at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
	at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
	at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
	at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
	at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:36)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:50)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

错误代码

import org.junit.Test;

public class Test01 

    @Test
    public void test()
        System.out.println("hello world");
    


原因

代码没有任何问题。@Test注解是放在方法上的,@Test注解也来自于包org.junit.Test

这个问题必须同另外一个问题一起说明比较合适:使用Junit单元测试报错“No tests found matching Method test01(Test01) from ClassRequest@5387f9e0“

模拟下出现问题代码的环境:maven项目,有一个main/java/Test01.javatest/java/Test01.java类。

main/java/Test01.java

import org.junit.Test;

public class Test01 
    @Test
    public void test01() 
        System.out.println("hello world - main/java/Test01.java");
    

test/java/Test01.java

public class Test01 
    public static void main(String[] args) 
        System.out.println("hello world - test/java/Test01.java");
    

要出现上面的问题,需要符合下面的情况:

  • 相同路径。指的是类的路径必须同级,如test/java/Test01.javamian/java/Test01.java是同级路径,test/java/Test01.javamian/java/hello/Test01.java就不是同级路径了,也就不会发生冲突。
  • 相同类名。指的是在相同路径下的类名相同,如test/java/Test01.javamain/java/Test01.java既是相同路径又类名相同,test/java/Test02.javamain/java/Test01.java虽然路径相同但是类名不同,也不会发生冲突。
  • 使用@Test注解与否。在路径和类名都相同的情况下,如果main/java/Test01.java中有使用了@Test注解的方法,而test/java/Test01.java中一定没有使用@Test注解的方法就会发生此冲突,如果有使用了@Test注解的方法并且方法名不同就会报使用Junit单元测试报错“No tests found matching Method test01(Test01) from ClassRequest@5387f9e0“

在满足上述条件后,执行main/java下的带有@Test注解的测试方法才会报上面这个错。

解决

  • 让它们的类路径不同
  • 让它们的类名不同
  • test/java下一定要有使用了@Test注解的方法

总之,建议不要在main/java下写带有@Test注解的测试方法,更不要让它们冲突。

以上是关于junit单元测试报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing的主要内容,如果未能解决你的问题,请参考以下文章

JUnit 报错 method initializationerror not found:JUnit4单元测试报错问题

junit 单元测试报错java.lang.NoClassDefFoundError

[转]method initializationerror not found:JUnit4单元测试报错问题

错误记录Android 单元测试报错 ( ExampleUnitTest.kt: (3, 12): Unresolved reference: junit / Test / assertEqu )

如何解决JUnit4单元测试报错 :method initializationerror not found

junit单元测试报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing