Spring-test& JUnit 5 测试遇阻,NoSuchMethodError 问题解析
在使用 Spring-test和 JUnit 5 进行整合做单元测试时,我使用了较高版本的spring-test:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>6.1.14</version>
</dependency>
而junit5的版本却是较低版本的:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.1</version>
</dependency>
在尝试整合后,进行测试,发现控制台直接就是一记报错:
java.lang.NoSuchMethodError: 'org.junit.jupiter.api.extension.ExecutableInvoker org.junit.jupiter.api.extension.ExtensionContext.getExecutableInvoker()'
于是简单找了一下发现并没有对该错误有完美契合的解决方案,遂进行了问题排查。
NoSuchMethodError
. 程序运行时找不到某个方法。 顺着思路进行跟踪, getExecutableInvoker()
方法说明 Spring Test 框架和 JUnit Jupiter 版本之间可能存在不匹配的情况,于是怀疑这两个之间总有一个是有问题的。
1. 检查 Spring-test版本
正常来说最新版本一定是把对junit的兼容性做到当前最好的状态,但发现spring-test已经是最新版本,那么出问题的就很有可能是JUnit。
2. 检查 JUnit 5版本
查找最新版本依赖,发现最新版都已经是:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.11.2</version>
</dependency>
于是尝试更新了一下,果然有效。
总结一下解决问题的思路:
1.升级依赖版本
检查所有依赖项, 特别是与测试相关的依赖项,保证它们都使用的是最新版本, 尝试升级 Spring Test 以及其他可能引入 JUnit Jupiter 的依赖项。
2.强制指定版本
如果升级版本仍未解决,那么就要考虑特定版本之间的兼容性问题,因为项目其他处可能引用了之前版本,需仔细甄便, 避免引发新的冲突。
文章参考:Spring Boot 测试遇阻:如何解决 NoSuchMethodError 错误? - ByteZoneX社区