SpringBoot MockMvc测试出现HttpServletResponse类缺失异常求助
问题分析与解决方案
错误核心原因
java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpServletResponse 本质是Servlet API包名版本冲突:
- Spring Boot 2.x及以下版本基于
javax.servlet包的Servlet API - Spring Boot 3.x及以上版本因Jakarta EE规范变更,迁移到
jakarta.servlet包
你的项目依赖大概率混合了这两个版本的Servlet API,或测试依赖与主项目Spring Boot版本不匹配,导致JVM无法找到对应类。
测试代码的额外问题
除依赖问题外,测试代码还有几处需修正:
- setup方法未生效:未添加
@BeforeEach注解(JUnit 5),手动构建MockMvc的代码不会执行,且@Autowired的MockMvc与手动构建实例存在冲突 - @WithMockUser用法错误:该注解参数应为用户名而非路径,正确写法如
@WithMockUser(username = "Alex-1") - 无需手动构建MockMvc:
@WebMvcTest注解会自动配置带Spring Security支持的MockMvc实例,无需通过MockMvcBuilders手动构建
修复步骤
1. 统一Spring Boot版本
确保pom.xml(Maven)或build.gradle(Gradle)中所有Spring Boot相关依赖版本一致:
- 若用Spring Boot 2.x,检查是否意外引入
jakarta.servlet相关包,直接移除 - 若用Spring Boot 3.x,确保所有依赖(含测试依赖)适配Jakarta EE规范,
spring-boot-starter-test会自动引入正确的Servlet API依赖
2. 修正测试代码
修改后的测试代码如下:
@ExtendWith(SpringExtension.class) @WebMvcTest(AuthController.class) class StoreserviceTest { @Autowired private MockMvc mvc; @MockBean private JpaUserservice jpaUserservice; @MockBean private JpaUserrepository jpaUserrepository; @MockBean private PasswordEncoder passwordEncoder; @WithMockUser(username = "Alex-1") @Test void checksecurity() throws Exception { MvcResult result = mvc.perform(get("/jpauser/alex")) .andExpect(status().is4xxClientError()) .andReturn(); assertEquals(401, result.getResponse().getStatus()); } }
3. 排查依赖冲突
- Maven项目执行
mvn dependency:tree,Gradle项目执行./gradlew dependencies,检查是否同时存在javax.servlet和jakarta.servlet依赖,排除冲突项
内容的提问来源于stack exchange,提问作者user20112858
相关产品推荐
相关产品推荐

