IDEA 运行 Junit 测试用例报 !!! JUnit version 3.8 or later expected 错误

问题介绍

在使用 IDEA 运行 Junit 测试用例的时候,控制台报了!!! JUnit version 3.8 or later expected错误,完整报错信息如下:

!!! JUnit version 3.8 or later expected:

java.lang.ClassNotFoundException: junit.framework.ComparisonFailure
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at com.intellij.rt.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:209)
	at com.intellij.rt.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:195)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:49)

我的测试代码

import org.junit.jupiter.api.Test;

public class StronglyReferenceTest {

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

}

问题排查

看到ClassNotFoundException第一反应就是包冲突,所以先排查项目的依赖,看是否有依赖冲突。查看了pom文件,项目关于junit的依赖只有:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.7.1</version>
    <scope>test</scope>
</dependency>

显然这并不会导致包冲突,而且当我使用mvn clean test命令去执行测试用例的时候,测试用例能正常执行

$ mvn clean test
...

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.736 s
[INFO] Finished at: 2021-03-13T21:01:28+08:00
[INFO] Final Memory: 14M/68M
[INFO] ------------------------------------------------------------------------

这就更加证明了项目代码本身没什么问题,该报错有可能是 IDEA 的 bug,所以去 google 看有没有人遇到相关的问题,查找了一番后,发现遇到该问题的人还不少

image.png

搜索到的网站基本都被我浏览了一遍,后面找到一个帖子,这位作者虽然跟我一样的报错,但他是在运行main方法的时候报的错,并不是运行junit测试方法时报的,原文链接为:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003450980-JUnit-version-3-8-or-later-expected?page=2#comments

他产生该问题的原因是类名使用了Test结尾,而以Test结尾的类,IDEA 会将其识别为 junit 测试类去运行(这是IDEA的bug,不过我用的版本已经修复了)。解决方案就是类名去掉Test后缀

上面的解决方案给了我一点启发,会不会我的错误也是类名问题呢?于是我也去掉Test后缀,即将StronglyReferenceTest改为StronglyReferenc后再次执行测试方法,发现问题解决了,测试方法执行正常

但我的类本来就是一个 junit 测试类啊,为什么以Test结尾也会报错呢?而且我之前的其他项目,类名也是以Test结尾的,也能正常运行

后来发现原来是我之前在src/main/java下也创建了一个StronglyReferenceTest

image.png

src/main/java文件夹下有与src/test/java文件夹下相同名字的类时,执行该类的测试方法就会报错,解决方案就是尽量避免相同名称的类出现(实际上项目中一般不会出现这种问题)

结论

src 下的类,最好不要以Test结尾,这样做并不规范,而且容易导致编辑器的误解,以为该类是测试类,从而导致意想不到的错误

我也向 IDEA 上报了该问题,等待 IDEA 的回复,感兴趣的同学可以点击该链接围观:https://youtrack.jetbrains.com/issue/IDEA-264240

最后,如果该文章对你有帮助的话,可以在微信搜索huangxy关注我的公众号,也可以扫下方二维码进行关注

公众号二维码.jpg

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JUnit是一个用于编写和运行测试用例Java测试框架。它提供了一组注解和断言方法,使得编写和执行单元测试变得更加简单和方便。 JUnit测试用例通常包含以下几个部分: 1. 测试类:一个普通的Java类,用于编写测试方法。 2. 测试方法:使用@Test注解标记的方法,用于测试被测代码的某个功能或行为。 3. 断言方法:用于验证测试结果是否符合预期的方法。 在编写JUnit测试用例时,可以使用以下几个常用的注解: 1. @Test:标记一个方法为测试方法。 2. @Before:在每个测试方法执行之前执行,用于初始化测试环境。 3. @After:在每个测试方法执行之后执行,用于清理测试环境。 4. @BeforeClass:在所有测试方法执行之前执行,用于初始化一次性的资源。 5. @AfterClass:在所有测试方法执行之后执行,用于清理一次性的资源。 在测试方法中,可以使用断言方法来验证测试结果是否符合预期。JUnit提供了一系列的断言方法,例如: 1. assertEquals(expected, actual):验证两个值是否相等。 2. assertTrue(condition):验证条件是否为真。 3. assertFalse(condition):验证条件是否为假。 4. assertNull(object):验证对象是否为空。 5. assertNotNull(object):验证对象是否不为空。 除了上述基本的使用方式外,JUnit还支持参数化测试、异常测试、测试套件等高级功能,可以根据具体的需求选择使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值