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 类:
@Configuration
public class SpringConfig implements WebMvcConfigurer {
@Override
public 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() {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@BeforeEach // @BeforeEach is JUnit5, @Before is JUnit4
public void setUp() {
mockMvc = MockMvcBuilders .webAppContextSetup(webApplicationContext)
.addFilter((request, response, chain) -> {
response.setCharacterEncoding("UTF-8"); // this is crucial
chain.doFilter(request, response);
}) .build();
}
}