如何用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
相关产品推荐
相关产品推荐

