首页 > 其他分享 >解决在 Spring Boot 中运行 JUnit 测试遇到的 NoSuchMethodError 错误

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

时间:2022-08-25 03:22:07浏览次数:199  
标签:Spring Boot NoSuchMethodError junit jupiter 版本 JUnit

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

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

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

错误的界面如下

 

2022-08-24_14-45-06

 

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 依赖。

需要添加的代码如下:

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

如果这个时候,你尝试运行测试的话,你将会得到 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 来使用你指定的版本了:

<properties>
    <junit-jupiter.version>5.7.1</junit-jupiter.version>
</properties>

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

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

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
</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
错误进行了一些阐述,并且针对这个问题提供了解决方案。

 

https://www.ossez.com/t/spring-boot-junit-nosuchmethoderror/14066

标签:Spring,Boot,NoSuchMethodError,junit,jupiter,版本,JUnit
From: https://www.cnblogs.com/huyuchengus/p/16622946.html

相关文章

  • 二、Spring Cloud Alibaba,Nacos
    1、下载nacos官网:https://nacos.io/zh-cn/index.html下载地址:https://github.com/alibaba/nacos/releases选择对应版本:2.1.0https://github.com/alibaba/nacos/releas......
  • 基于.NET6、FreeSql、若依UI、LayUI、Bootstrap构建插件式的CMS
    近几年,.net生态日益强大,特别是跨平台技术,性能提升,那真的是强大无比。为了日常能够快速开发,笔者基于基于.NET6、FreeSql、若依UI、LayUI、Bootstrap构建插件式的CMS,请大家......
  • SpringCloud - Seata 总结
    参考资料介绍Seata就是一个分布式事务处理框架,它是由阿里巴巴和蚂蚁金服共同开源的分布式事务解决方案,能够在微服务架构下提供高性能且简单易用的分布式事务服务。核心......
  • springBoot使用过滤器进行权限认证和静态资源放行
    importjava.io.IOException;importjava.util.HashSet;importjava.util.Set;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servl......
  • SpringBoot项目requestId生成/日志打印
    原因SpringBoot项目中的默认日志框架SLF4J,在打印日志时,每行数据都有一个请求ID,这样会方便追踪日志。也可以使用一些链路追踪框架来实现这种目的。实现SLF4J里有一个MDC......
  • 解决Spring MVC中put和delete请求不能获取到前端页面传来数据的问题
    springMVC中的非简单请求在发请求加入data字段$(function(){$("#btnPost").click(function(){$.ajax({url:"/restful/request/100",......
  • Spring 源码学习笔记10——Spring AOP
    Spring源码学习笔记10——SpringAOP参考书籍《Spring技术内幕》SpringAOP的实现章节书有点老,但是里面一些概念还是总结比较到位源码基于Spring-aop5.3.22可能和旧......
  • SpringBoot Excel导入导出
    一、引入pom.xml依赖<!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><......
  • SpringBoot使用RabbitMq实现队列和延时队列
    闲来无事看了看RabbitMq的队列,总结了一些队列的实现方法,当然,免不了各种看别人的博客哈哈哈其中延时队列有两种方式,一种是使用TTl+死信队列实现,一种是直接用RabbitMq的官方......
  • 自己重写的基于BootStrap的记住选择
    问题背景:(1)在Ruoyi中,使用弹窗式列表获取合同对应商品,再选择增加商品;(2)要能翻页保存点击记录(3)经过长时间检测,发现原Ruoyi自带的  $.table.selectColumns("userCode"); ......