• 解决在 Spring Boot 中运行 JUnit 测试遇到的 NoSuchMethodError 错误


    在本文章中,我们将会解决在 Spring Boot 运行测试的时候,得到 NoSuchMethodError 和 NoClassDefFoundError 的 JUnit 错误。

    这个错误的原因,通常是因为我们的系统中有 2 个不同的 JUnit 版本,在运行的时候 JUnit 不知道使用哪个版本来运行。

    同时,也有可能是因为 JUnit 测试运行使用的的版本和框架运行的版本不同而导致的。

    错误的界面如下

    Spring 项目中的 JUnit NoClassDefFoundError 错误

    让我们假设我们的 Spring Boot 项目中使用的 Boot 版本为 2.1.2。

    基于上面的 Spring Boot 版本,我们可以使用的 JUnit 测试的版本为 5.3.2,这个版本就是 spring-boot-test 项目中使用的依赖。

    假设,现在我们还是希望使用 Spring Boot 2.1.2. 但是,我们希望使用 JUnit 5.7.1 版本来进行测试。

    一个可行的办法就是在你的 POM.xml 文件中添加 junit-jupiter-apijunit-jupiter-paramsjunit-jupiter-engine, 和 junit-platform-launcher 依赖。

    需要添加的代码如下:

    1. <dependency>
    2. <groupId>org.junit.jupiter</groupId>
    3. <artifactId>junit-jupiter-api</artifactId>
    4. <version>5.7.1</version>
    5. <scope>test</scope>
    6. </dependency>
    7. ...

    如果这个时候,你尝试运行测试的话,你将会得到 NoClassDefFoundError 错误:

    [ERROR] java.lang.NoClassDefFoundError: org/junit/platform/commons/util/ClassNamePatternFilterUtils
    

    如果你不想使用 5.3.2 的版本,想升级到 JUnit 5.4.0 版本,当你再次运行测试的时候,我们还是会得到 NoClassDefFoundError 和 NoSuchMethodError 错误。

    错误原因

    不管你使用 JUnit 的何种版本,只要你使用的版本和 Spring Boot 中使用的版本不一致的话,我们都会得到 NoClassDefFoundError 这个错误。

    这个错误的主要原因是我们的 classpath 中最后有 2 个不同版本的 JUnit。

    我们的项目使用的是 JUnit (5.7.1) 版本进行编译的,但是在运行的时候使用的 (5.3.2) 这个版本来运行的。

    上面的情况的结果就是 JUnit launcher 尝试用老版的 JUnit 版本中不存在的类来运行。

    知道上面的原因后,我们下面来看看可以使用的一些修复方法。

    主要解决思路就是让整个项目中只有一个 JUnit 的版本。

    修改办法 - 重写 Spring Boot 中使用的 JUnit

    这个可能是最有效的方法了。

    Spring Boot 可以让你调整属性文件中的版本配置来配置使用不同的版本,你只需要简单的调整 pom.xml 中的版本属性中的版本号,就可以让 Spring Boot 来使用你指定的版本了:

    1. <properties>
    2. <junit-jupiter.version>5.7.1</junit-jupiter.version>
    3. </properties>

    如果你的 pom 文件中没有这个属性的话,添加一个就可以了。

    然后将下面的内容添加到你的 pom 文件中,在这里我们只需要一个 junit-jupiter 就可以了。

    1. <dependency>
    2. <groupId>org.junit.jupiter</groupId>
    3. <artifactId>junit-jupiter</artifactId>
    4. </dependency>

    上面的配置将会包含 junit-jupiter-apijunit-jupiter-params, 和 junit-jupiter-engine.

    junit-platform-launcher 依赖,通常只是在编程运行 JUnit 的时候需要。

    针对 Gradle project 的项目,我们可以使用下面的属性配置

    ext['junit-jupiter.version'] = '5.7.1'
    

    针对其他的项目

    在上面的部分,我们了解了如何在 Spring Boot 中来修正 NoSuchMethodError 和 NoClassDefFoundError 错误,这个错误在 Spring Boot 中属于比较常见的错误。

    如果是其他不使用 Spring 的 Maven 项目,我们也可以通过上面的方法来修改冲突。

    和 Spring Boot 中的修改方法是一样的,通常都是因为版本冲突的原因导致的。

    我们可以通过分析 Maven 中的依赖来找到冲突的版本进行版本调整就可以了。

    结论

    在本文章中,我们对 Spring 常见的 NoSuchMethodError 和 NoClassDefFoundError JUnit
    错误进行了一些阐述,并且针对这个问题提供了解决方案。

    解决在 Spring Boot 中运行 JUnit 测试遇到的 NoSuchMethodError 错误 - Java - OSSEZ

     

  • 相关阅读:
    LeetCode:1337. 矩阵战斗力最弱的 K 行、11. 盛最多水的容器、剑指 Offer 51. 数组中的逆序对题解
    栈的应用场景和介绍 [数据结构][Java]
    2022年Java面试题最新整理,附白话答案
    JavaScript 67 JavaScript HTML DOM 67.11 JavaScript HTML DOM 导航
    Sophon CE社区版上线,免费Get轻量易用、高效智能的数据分析工具
    Java 进程
    学习pytorch15 优化器
    安装mmcv及GPU版本的pytorch及torchvision
    MySQL数据库:7、SQL常用查询语句
    使用UiPath和AA构建的解决方案 3. CRM 自动化
  • 原文地址:https://blog.csdn.net/huyuchengus/article/details/126516264