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

如何用Mockito测试含RequestBody与MultipartFile的文件上传API?

使用Mockito测试同时接收RequestBody和文件的RESTful API

要测试这类同时接收JSON对象和上传文件的控制器方法,我们通常结合Spring MockMvc(模拟HTTP请求)和Mockito(Mock业务层依赖)实现轻量级控制器测试,无需启动完整Spring容器。

测试类配置

首先创建测试类,指定要测试的控制器,Mock依赖服务,并注入MockMvc和ObjectMapper:

import org.junit.jupiter.api.Test;
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.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.MockMvc;
import com.fasterxml.jackson.databind.ObjectMapper;

@WebMvcTest(YourFileUploadController.class) // 替换为你的控制器类名
class FileUploadControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private YourBusinessService businessService; // 替换为控制器依赖的业务类

    @Autowired
    private ObjectMapper objectMapper;
}

编写测试方法

构造测试用的DocumentInfo和模拟文件,通过MockMvc发送multipart请求并验证结果:

@Test
void uploadFile_ShouldReturnSuccess() throws Exception {
    // 1. 准备测试数据
    DocumentInfo testDocInfo = new DocumentInfo();
    testDocInfo.setDocId("TEST-DOC-001");
    testDocInfo.setDocName("用户上传测试文档");
    String docInfoJson = objectMapper.writeValueAsString(testDocInfo);

    // 模拟上传文件
    MockMultipartFile mockFile = new MockMultipartFile(
        "file", // 必须与控制器@RequestParam("file")的参数名完全一致
        "sample.txt",
        MediaType.TEXT_PLAIN_VALUE,
        "测试文件内容".getBytes()
    );

    // 2. 发送请求并验证响应
    mockMvc.perform(MockMvcRequestBuilders.multipart("/api/files/upload") // 替换为你的API路径
            .file(mockFile)
            .requestPart("info", docInfoJson) // 用requestPart传递JSON,对应控制器的@RequestBody
            .contentType(MediaType.MULTIPART_FORM_DATA))
            .andExpect(status().isOk())
            .andExpect(content().string("文件上传成功")); // 替换为控制器实际返回值

    // 3. 验证业务层方法是否被正确调用(如果有依赖)
    Mockito.verify(businessService, Mockito.times(1))
            .handleUpload(Mockito.any(DocumentInfo.class), Mockito.any(MultipartFile.class));
}

关键细节

  • Multipart请求参数传递:由于同时包含文件和JSON对象,必须使用multipart请求。用requestPart传递JSON字符串,Spring会自动将其解析为DocumentInfo对象,匹配控制器的@RequestBody参数。
  • MockMultipartFile参数匹配:第一个参数的名称必须和控制器@RequestParam("file")中的参数名完全一致,否则无法绑定到方法参数。
  • Mockito验证逻辑:如果控制器依赖业务层服务,通过Mockito.verify可以确认服务方法是否按预期被调用,包括调用次数和参数匹配情况。

如果控制器没有业务层依赖,只需去掉@MockBean和Mockito验证部分,专注于验证请求响应即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:27:36