Spring MVC中MockMvc测试Controller遇参数传递与媒体类型不支持报错
解决MockMvc测试Spring MVC接口时的415 MediaType不支持问题
你遇到的415错误核心是请求体传递逻辑错误,再加上可能的Spring MVC JSON解析配置缺失,咱们一步步来修复:
1. 修正测试代码的请求体传递方式
你的接口用@RequestBody Map map接收请求体中的JSON,但测试代码里错误地用.param("map", requestJson)把JSON当成了URL参数传递,这完全不符合@RequestBody的接收规则。你需要把JSON内容放在请求体里,而不是作为请求参数:
修改testQueryscanResultList方法:
@Test public void testQueryscanResultList() throws Exception { Map<String, String> testMap = new HashMap<>(); testMap.put("key1", "value1"); testMap.put("key2", "value2"); String requestJson = JSONObject.toJSONString(testMap); mockMvc.perform( post("/API/scanresultconfigure/queryScanResultList/001/abc") .contentType(MediaType.APPLICATION_JSON) .content(requestJson) // 用content传递请求体,替代param .accept(MediaType.APPLICATION_JSON) // 显式指定接受响应类型更规范 ) .andExpect(status().isOk()) .andDo(print()); }
2. 确保Spring MVC具备JSON解析能力
Spring MVC默认依赖Jackson来处理JSON的序列化和反序列化,如果项目中缺失相关依赖,会导致无法解析application/json类型的请求体。
如果是Maven项目,确保pom.xml中包含以下依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>你的版本号,比如2.15.2</version> <scope>test</scope> <!-- 仅测试环境需要则保留,否则去掉 --> </dependency>
3. 修正测试类的Spring配置
你的测试类@ContextConfiguration只加载了ScanResultConfigureController,缺少Spring MVC的核心配置(比如@EnableWebMvc),这会导致MockMvc无法正确初始化JSON解析器。
你可以修改测试类的配置,引入项目中已有的Spring MVC配置类:
@WebAppConfiguration @ContextConfiguration(classes = {WebConfig.class, ScanResultConfigureController.class}) // 替换WebConfig为你项目的MVC配置类 @ComponentScan(basePackages = "app.dnatask.controller") public class ScanResultConfigureControllerTest extends AbstractTestNGSpringContextTests { // ... 其他代码不变 }
如果没有专门的Web配置类,也可以在测试类中添加内部配置类:
@WebAppConfiguration @ContextConfiguration(classes = {ScanResultConfigureControllerTest.WebConfig.class, ScanResultConfigureController.class}) public class ScanResultConfigureControllerTest extends AbstractTestNGSpringContextTests { @Configuration @EnableWebMvc @ComponentScan(basePackages = "app.dnatask.controller") public static class WebConfig { // 可按需添加自定义Bean,比如Jackson的ObjectMapper } // ... 其他代码不变 }
验证修复
完成以上修改后重新运行测试,应该就能正确解析JSON请求体,返回200状态码了。
内容的提问来源于stack exchange,提问作者keshuan_jeme
相关产品推荐
相关产品推荐

