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

