MockMvc HttpMediaTypeNotSupportedException:不支持内容类型“applicationjson”

作者:编程家 分类: js 时间:2025-12-14

文章:

在进行Web开发中,我们经常使用MockMvc来进行单元测试和集成测试。MockMvc是Spring框架提供的一个测试工具,它可以模拟发送HTTP请求,并对返回结果进行验证。然而,有时候我们在使用MockMvc进行测试时可能会遇到HttpMediaTypeNotSupportedException异常,提示不支持内容类型"application/json"。那么该如何解决这个问题呢?下面我们将介绍一种解决方案。

案例代码:

假设我们有一个UserController类,其中包含一个处理POST请求的方法createUser:

java

@RestController

@RequestMapping("/users")

public class UserController {

@PostMapping

public ResponseEntity createUser(@RequestBody User user) {

// 处理创建用户的逻辑

return ResponseEntity.ok(user);

}

}

我们希望使用MockMvc进行测试,验证用户创建接口的正确性。首先,我们需要创建一个测试类,并使用@SpringBootTest和@AutoConfigureMockMvc注解进行配置:

java

@RunWith(SpringRunner.class)

@SpringBootTest

@AutoConfigureMockMvc

public class UserControllerTests {

@Autowired

private MockMvc mockMvc;

@Test

public void testCreateUser() throws Exception {

User user = new User("John", "Doe");

String json = new ObjectMapper().writeValueAsString(user);

mockMvc.perform(post("/users")

.contentType(MediaType.APPLICATION_JSON)

.content(json))

.andExpect(status().isOk())

.andExpect(jsonPath("$.firstName", is("John")))

.andExpect(jsonPath("$.lastName", is("Doe")));

}

}

在上述代码中,我们首先创建了一个User对象,并将其转换成JSON字符串。然后使用MockMvc发送POST请求,设置请求的内容类型为"application/json",并将JSON字符串作为请求的内容。接着,我们使用andExpect方法对返回结果进行验证,确保返回的状态码为200,并且返回结果中的firstName和lastName与我们设置的值一致。

然而,当我们运行这段测试代码时,可能会遇到HttpMediaTypeNotSupportedException异常,提示不支持内容类型"application/json"。这是由于在测试环境中,MockMvc默认使用的媒体类型是"application/x-www-form-urlencoded",而不是"application/json"。

为了解决这个问题,我们可以在测试类中添加一个@Before方法,在该方法中设置MockMvc的默认媒体类型为"application/json":

java

@Before

public void setup() {

mockMvc = MockMvcBuilders.standaloneSetup(new UserController())

.defaultRequest(MockMvcRequestBuilders.post("/users")

.contentType(MediaType.APPLICATION_JSON))

.build();

}

通过上述代码,我们在每个测试方法执行之前都会调用setup方法,该方法会重新构建MockMvc,并设置默认的请求媒体类型为"application/json"。这样,我们就解决了HttpMediaTypeNotSupportedException异常的问题。

在使用MockMvc进行Web开发测试时,遇到HttpMediaTypeNotSupportedException异常是比较常见的情况。通过设置MockMvc的默认请求媒体类型为"application/json",我们可以解决这个问题。这样,我们就可以愉快地使用MockMvc进行单元测试和集成测试了。