You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无法找到对应类。

测试代码的额外问题

除依赖问题外,测试代码还有几处需修正:

  1. setup方法未生效:未添加@BeforeEach注解(JUnit 5),手动构建MockMvc的代码不会执行,且@Autowired的MockMvc与手动构建实例存在冲突
  2. @WithMockUser用法错误:该注解参数应为用户名而非路径,正确写法如@WithMockUser(username = "Alex-1")
  3. 无需手动构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:45:35