MockMvc 如何使用
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 类:
@Configurationpublic class SpringConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.stream().filter(converter -> converter instanceof MappingJackson2HttpMessageConverter).findFirst().ifPresent(converter -> ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8));}}
使用 MockMvcBuilders 来自定义 MockMvc
class PersonTest() {@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@BeforeEach // @BeforeEach is JUnit5, @Before is JUnit4public void setUp() {mockMvc = MockMvcBuilders .webAppContextSetup(webApplicationContext).addFilter((request, response, chain) -> {response.setCharacterEncoding("UTF-8"); // this is crucialchain.doFilter(request, response);}) .build();}}
