Spring Boot 3.4.2升级后测试类执行失败求助
问题:Spring Boot 3.4.2升级后测试用例执行失败(NoSuchMethodError)
我已将Spring Boot版本升级至id 'org.springframework.boot' version '3.4.2',同步更新了所有依赖。由于3.4.X版本中@MockBean已废弃,我将测试代码中的@MockBean替换为@MockitoBean,但测试用例仍执行失败,报错信息如下:
java.lang.NoSuchMethodError: 'java.util.LinkedHashSet org.springframework.util.CollectionUtils.newLinkedHashSet(int)' at org.springframework.test.context.TestContextManager.(TestContextManager.java:95) at org.springframework.test.context.junit.jupiter.SpringExtension.getTestContextManager(SpringExtension.java:363) at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:158) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at java.base/java.util.Optional.orElseGet(Optional.java:364) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
项目的build.gradle配置如下:
plugins { id 'org.springframework.boot' version '3.4.2' id 'io.spring.dependency-management' version '1.1.6' id 'java' id 'jacoco' id 'org.sonarqube' version '5.1.0.4882' id 'maven-publish' id 'com.gorylenko.gradle-git-properties' version '2.4.2' id 'io.freefair.lombok' version '8.10' } group = 'com.edwardjones' version = 'VERSION_NUMBER' java { sourceCompatibility = JavaVersion.VERSION_17 } repositories { maven { url 'http://maven.edj.devjones.com:8181/artifactory/repo' allowInsecureProtocol = true } //temporarily added to resolve dependency resolution issue for jboss-logging 3.5.1.Final maven { url 'http://repository.edwardjones.com:8181/artifactory/libs-release/' allowInsecureProtocol = true } } configurations.all { exclude group: "org.bouncycastle", module: "bcpkix-jdk15on" exclude group: 'ch.qos.reload4j' } ext['spring-security-config.version']= '6.3.4' ext['hazelcastVersion']= '5.3.6' dependencies { //Crm-cluster-starter - Retry, DLT & Circuit Breaker for pause/Resume implementation 'com.edwardjones.crm:crm-kafka-cluster-starter:1.1.1' implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.security:spring-security-config' implementation 'org.springframework:spring-aspects' //EJ framework implementation 'com.edwardjones.framework:frm-slf4j' implementation 'com.edwardjones.framework:frm-stats' implementation 'com.edwardjones.framework:frm-spring-boot-starter-rest-server' implementation 'com.edwardjones.framework:frm-spring-boot-starter-security' implementation 'com.edwardjones.security:wam-auth-password' implementation 'com.edwardjones.framework:frm-spring-rest-client' implementation 'org.springframework:spring-webmvc:7.0.0-M1' implementation "org.springframework:spring-webflux:7.0.0-M1" //Fix CVE-2024-38816 // CVE-2024-38810 implementation 'org.springframework.security:spring-security-core:6.4.2' // bsd logging implementation 'com.edwardjones.bsd:bsd-error-logging:2.0.0' // Swagger OpenAPI implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' // HTTP Components implementation 'org.apache.httpcomponents.core5:httpcore5:5.3.3' implementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' // Hashicorp Vault implementation 'org.springframework.cloud:spring-cloud-starter-vault-config:4.2.0' implementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' // Needed to patch snakeyaml:1.3.3 vulnerability in dependencies implementation 'org.yaml:snakeyaml:2.3' // Needed to patch json-smart vulnerability implementation 'com.jayway.jsonpath:json-path:2.9.0' implementation 'com.nimbusds:oauth2-oidc-sdk:11.21.3' implementation 'io.netty:netty-handler:5.0.0.Alpha2' implementation 'io.netty:netty-codec:5.0.0.Alpha2' implementation 'io.netty:netty-codec-http2:5.0.0.Alpha2' implementation 'org.xerial.snappy:snappy-java:1.1.10.5' implementation 'io.projectreactor.netty:reactor-netty-http:1.1.13' /** timestamp interceptor **/ implementation ('io.confluent:timestamp-interceptor:7.6.1'){ exclude group: 'io.swagger.core.v3' exclude group: 'org.eclipse.jetty' exclude group: 'com.google.protobuf' , module:'protobuf-java' exclude group: 'io.netty', module:'netty-common' } //resilience4j implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'io.github.resilience4j:resilience4j-spring-boot3' implementation 'io.github.resilience4j:resilience4j-annotations' implementation 'io.github.resilience4j:resilience4j-all' implementation 'org.springframework.cloud:spring-cloud-stream' implementation 'org.springframework.cloud:spring-cloud-function-context' implementation 'org.springframework.cloud:spring-cloud-stream-binder-kafka' // Hazelcast implementation "org.springframework.session:spring-session-hazelcast" implementation "com.hazelcast:hazelcast:${hazelcastVersion}" implementation "com.hazelcast:hazelcast-spring:${hazelcastVersion}" testImplementation "com.hazelcast:hazelcast:${hazelcastVersion}:tests" //CVE-2024-7254 implementation 'com.google.protobuf:protobuf-java:4.27.5' //CVE-2021-47621 implementation 'io.github.classgraph:classgraph:4.8.112' //CVE-2024-47561 // implementation 'org.apache.avro:avro:1.11.4' //CVE-2024-38821 implementation 'org.springframework.security:spring-security-web:6.3.4' //CVE-2024-47535 implementation 'io.netty:netty-common:4.1.115.Final' // CVE-2024-52317 implementation 'org.apache.tomcat.embed:tomcat-embed-core:11.0.2' //CVE-2024-38820 implementation 'org.springframework:spring-context:6.1.14' implementation 'org.springframework:spring-web:6.1.14' implementation 'org.springframework:spring-core:6.1.14' //CVE-2024-38827 implementation 'org.springframework:spring-expression:6.1.14' implementation 'org.springframework:spring-beans:6.1.14' runtimeOnly 'org.springframework.boot:spring-boot-devtools:3.4.2' compileOnly "jakarta.servlet:jakarta.servlet-api:6.1.0" testCompileOnly "jakarta.servlet:jakarta.servlet-api:6.1.0" testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' testImplementation 'org.springframework.boot:spring-boot-starter-test:3.4.2', 'org.springframework.security:spring-security-test:6.4.2', 'org.springframework.kafka:spring-kafka-test:3.3.2', 'org.awaitility:awaitility:4.2.2' } dependencyManagement { imports { mavenBom 'com.edwardjones.framework:frm-framework-dependencies:4.3.0' mavenBom "org.springframework.cloud:spring-cloud-dependencies:2023.0.3" } } springBoot { buildInfo() } jar { enabled = false } publishing { publications { mavenJava(MavenPublication) { artifact bootJar } } } jacocoTestReport { dependsOn test // tests are required to run before generating the report reports { xml.required = true } } test { useJUnitPlatform() finalizedBy jacocoTestReport } sonarqube { properties { property "sonar.exclusions", "**/com/edwardjones/cap/fundtrades/producer/config/OpenApiConfig.java" // use this property for to run sonar on local // property "sonar.host.url", http://nldasonar-2.edj.devjones.com:9010 } }
解决方案
核心问题:Spring版本依赖冲突
报错NoSuchMethodError说明运行时类路径中存在不同版本的Spring核心库,CollectionUtils.newLinkedHashSet(int)方法仅在Spring 6.2+(对应Spring Boot 3.4.x)中存在,但你的配置硬编码了多个Spring核心组件为6.1.14版本,导致版本不兼容。同时引入的Spring WebMVC/WebFlux 7.0.0-M1里程碑版本与Spring Boot 3.4.2完全不匹配。修复步骤:
- 移除硬编码的Spring核心组件版本:删除以下依赖,让Spring Boot的依赖管理自动控制适配版本:
//CVE-2024-38820 implementation 'org.springframework:spring-context:6.1.14' implementation 'org.springframework:spring-web:6.1.14' implementation 'org.springframework:spring-core:6.1.14' //CVE-2024-38827 implementation 'org.springframework:spring-expression:6.1.14' implementation 'org.springframework:spring-beans:6.1.14' - 删除不兼容的Spring WebMVC/WebFlux版本:移除以下两行里程碑版本依赖,Spring Boot starter会自动引入适配的web组件版本:
implementation 'org.springframework:spring-webmvc:7.0.0-M1' implementation "org.springframework:spring-webflux:7.0.0-M1" - 统一Spring Security版本:Spring Boot 3.4.2对应Spring Security 6.4.x,修改
ext配置统一版本,并移除硬编码的单个组件依赖:
同时删除ext['spring-security-config.version']= '6.4.2'spring-security-core:6.4.2和spring-security-web:6.3.4,让依赖管理自动处理版本。 - 清理并重建项目:执行
gradle clean build --refresh-dependencies刷新依赖缓存,确保所有依赖版本统一。
- 移除硬编码的Spring核心组件版本:删除以下依赖,让Spring Boot的依赖管理自动控制适配版本:
额外建议:
- 优先使用Spring Boot的starter和依赖管理机制,避免硬编码单个Spring组件版本,减少冲突风险。
- 修复CVE时优先通过升级Spring Boot版本解决,而非单独升级单个组件,Spring Boot会确保所有组件版本兼容。
内容的提问来源于stack exchange,提问作者Nandini
相关产品推荐
相关产品推荐

