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

Spring Boot控制器JUnit测试报错及优化方法咨询

一、原测试代码的核心问题及报错原因

  1. ApplicationContext加载失败:
    • 同时使用@WebMvcTest和手动MockMvcBuilders.standaloneSetup创建MockMvc,二者冲突。@WebMvcTest会自动配置Spring MVC测试上下文并提供MockMvc,无需手动创建。
    • @InjectMocks使用错误:@WebMvcTest仅加载控制器相关Bean,依赖的serviceImpl需用@MockBeanMock,而非注入真实实现(真实实现可能依赖未加载的Repo等,导致上下文初始化失败)。
  2. 请求方法与路径不匹配:控制器接口是@PostMapping,原测试用了GET请求;控制器类上有@RequestMapping("/project-files"),完整接口路径应为/project-files/deleteUploadedFile,原测试路径错误。
  3. 返回值解析逻辑错误:控制器返回Map<String, Object>,但测试试图将其解析为MyController[],类型完全不匹配,会导致反序列化失败。

二、修正后的完整测试代码

package com.test.project.web;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import com.test.project.beans.RequestModel;
import com.test.project.service.serviceImpl;

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTest {

    // 由@WebMvcTest自动注入配置好的MockMvc
    @Autowired
    private MockMvc mockMvc;

    // Mock控制器依赖的service层,避免依赖真实服务实现
    @MockBean
    private serviceImpl serviceImpl;

    @Test
    public void deleteUploadedFile_ShouldReturnSuccess() throws Exception {
        // 1. 准备Mock服务的返回值
        Map<String, Object> mockResponse = new HashMap<>();
        mockResponse.put("success", true);
        mockResponse.put("message", "文件删除成功");
        when(serviceImpl.deleteUploadedFile(any(RequestModel.class))).thenReturn(mockResponse);

        // 2. 发送POST请求,携带正确参数名requestData
        mockMvc.perform(post("/project-files/deleteUploadedFile")
                        .param("requestData", "test-file-id-123")
                        .contentType("application/x-www-form-urlencoded"))
                // 3. 链式断言响应状态与返回字段
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(true))
                .andExpect(jsonPath("$.message").value("文件删除成功"));
    }

    // 测试参数为空的场景
    @Test
    public void deleteUploadedFile_WithEmptyParam_ShouldReturnFail() throws Exception {
        Map<String, Object> mockResponse = new HashMap<>();
        mockResponse.put("success", false);
        mockResponse.put("message", "文件ID不能为空");
        when(serviceImpl.deleteUploadedFile(any(RequestModel.class))).thenReturn(mockResponse);

        mockMvc.perform(post("/project-files/deleteUploadedFile")
                        .contentType("application/x-www-form-urlencoded"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(false))
                .andExpect(jsonPath("$.message").value("文件ID不能为空"));
    }
}

三、更优的控制器JUnit测试编写方式

  1. 优先用@WebMvcTest:Spring Boot专为控制器测试设计的注解,仅加载控制器、Spring MVC核心组件,不加载全量应用上下文,测试速度更快。
  2. 用@MockBean隔离依赖:控制器依赖的Service、Repo等都用@MockBeanMock,避免依赖真实数据库或外部服务,保证测试独立性与稳定性。
  3. 链式断言简化代码:通过MockMvc的andExpect直接断言响应状态、JSON字段、响应头,无需手动解析响应内容,代码简洁易读。
  4. 覆盖多场景测试:测试正常参数、空参数、非法参数等场景,确保控制器逻辑覆盖完整。
  5. 消除冗余代码:无需手动实现mapFromJson或创建MockMvc,@WebMvcTest会自动注入所需组件。

四、你修改后代码的报错解决

  • post处报错:添加静态导入import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
  • status处报错:添加静态导入import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  • productlist及mapFromJson处报错:删除错误的类型解析逻辑,控制器返回的是Map而非控制器数组,改用jsonPath直接断言返回字段。

内容的提问来源于stack exchange,提问作者Raghavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:50:27