MockMvc 如何使用

  1. mockMvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Hello World"));

解决响应中文乱码问题

在使用 MockMvc 的过程中,你会发现如果响应内容中有中文,则会显示乱码。这是因为 HTTP 的默认字符集是 ISO8859-1。是以 ASCII 为基础建立的一套编码。它由 8 个字节组成,也就是说它并不能表示中文。
解决办法也很简单,将相应头中的 Content-Type 加上 charset=utf-8 即可。

修改 application.properties

你可以在配置文件中,加上 server.servlet.encoding.force=true,就可以使用 contentType(APPLICATION_JSON_UTF8_VALUE)。他会在响应应头上加上 charste=utf-8

添加 accept

在指定 contentType(MediaType.APPLICATION_JSON) 后,加上 accpet(MediaType.APPLICATION_JSON_UTF8_VALUE) 也会在响应头上加上 charset=utf-8

配置一个 Config 类

在测试中,还是使用 contentType(MediaType.APPLICATION_JSON)。然后在程序中添加 config 类:

  1. @Configuration
  2. public class SpringConfig implements WebMvcConfigurer {
  3. @Override
  4. public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  5. converters.stream()
  6. .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
  7. .findFirst()
  8. .ifPresent(converter -> ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8));
  9. }
  10. }

使用 MockMvcBuilders 来自定义 MockMvc

  1. class PersonTest() {
  2. @Autowired
  3. private WebApplicationContext webApplicationContext;
  4. private MockMvc mockMvc;
  5. @BeforeEach // @BeforeEach is JUnit5, @Before is JUnit4
  6. public void setUp() {
  7. mockMvc = MockMvcBuilders .webAppContextSetup(webApplicationContext)
  8. .addFilter((request, response, chain) -> {
  9. response.setCharacterEncoding("UTF-8"); // this is crucial
  10. chain.doFilter(request, response);
  11. }) .build();
  12. }
  13. }