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

Spring Boot使用MockMvc测试上传接口无法获取响应实体问题

问题根因

从你提供的测试日志可以看到抛出了HttpMessageNotWritableException异常,根因为单元测试的Spring上下文加载不完整:
测试类上的@SpringBootTest(classes= FileUploadServiceRestController.class)仅注册了Controller单个Bean,缺少JSON序列化所需的Jackson消息转换器、Web MVC相关配置组件,Spring无法将返回的JobStatus对象序列化为JSON响应体,最终导致响应体为空、状态码返回500。
生产环境客户端调用正常是因为完整启动时Spring Boot会自动加载Web MVC全套自动配置组件,包含JSON序列化所需的消息转换器,所以没有该问题。

修复方案

提供两种常用修复方式,可按需选择:

方案1:使用Controller层专用测试注解

将原测试类的@SpringBootTest注解替换为@WebMvcTest,该注解是Spring官方为Controller单元测试设计,会自动加载所有Web MVC必备组件(包括消息转换器、参数解析器等):

@RunWith(SpringRunner.class)
@WebMvcTest(FileUploadServiceRestController.class)
public class FileUploadServiceControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @MockBean
    private FileUploadServiceImpl fileService;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    // 原有测试逻辑保持不变
}

方案2:手动注册消息转换器

如果不想修改原有测试注解,可在构建MockMvc时手动添加Jackson的HTTP消息转换器:

@Before
public void setup() {
    mockMvc = MockMvcBuilders.webAppContextSetup(context)
            // 手动注入JSON序列化转换器
            .setMessageConverters(new MappingJackson2HttpMessageConverter())
            .build();
}

补充验证

修复完成后可在测试中新增返回体断言,验证响应内容符合预期:

mockMvc.perform(MockMvcRequestBuilders.multipart("/file/upload").file(file))
        .andDo(MockMvcResultHandlers.print())
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.jobId").value("uuid"))
        .andExpect(jsonPath("$.status").value(ConstantUtil.JOB_STARTED));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:06:03