【发布时间】:2020-08-05 03:59:54
【问题描述】:
当前技术栈:
- Spring Boot 2.3.2
- JUnit5
- MockMvc
在我的 application.properties 中,我包含了:
server.servlet.encoding.force=true
所以所有回复都会附加";charset=UTF-8"。这在 Swagger、Fiddler、现实世界中按预期工作。
我将单元测试构建为:
String result = mockMvc().perform(get("/customers")
.accept(MediaType.APPLICATION_xxx)
.header(HttpHeaders.AUTHORIZATION, authorization()))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_xxx_UTF8))
.andReturn()
.getResponse()
.getContentAsString();
List<CustomerDto> customers = this.objectMapper.readValue(result, new TypeReference<List<CustomerDto>>(){});
请注意,我已将预期的 contentType 设置为 MediaType.APPLICATION_xxx_UTF8,即 MediaType.APPLICATION_xxx 并附加了 ";charset=UTF-8"。
但是,回复只是MediaType.APPLICATION_xxx。
我是 junit 和 mockmvc 的新手,但我假设 mockmvc 并没有真正发送 http 请求?所以它没有通过 servlet 来附加字符集?
我怎样才能让它附加字符集?我知道我可以只接受非 UTF8 类型,但我想测试一下现实世界会得到什么。
编辑:Mockmvc 创建为:
public ControllerTestsBase(WebApplicationContext webApplicationContext,
FilterChainProxy springSecurityFilterChain) {
this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.addFilter(springSecurityFilterChain)
.build();
}
【问题讨论】:
-
展示您如何获取
mockMvc实例。 -
@chrylis-cautiouslyoptimistic- 更新帖子。
-
尝试使用
@Autowired MockMvc看看是否可以在那里工作。 -
@chrylis-cautiouslyoptimistic- 我今天对此更加着迷了...我明白问题出在哪里了...如果您执行下面的过滤技巧(并且 setCharacterEncoding 必须在 doFilter 或内部的 if 语句将失败),它确实正确更新了响应标头。如果您查看 MockHttpServletRequest::updateContentTypeHeader() 您会看到它仅更新 this.headers。它不会更新 this.contentType。因此,当您在单元测试中调用 .contentType() 时,它会得到原始的、未更改的。
-
@chrylis-cautiouslyoptimistic- 看起来他们修复了它github.com/spring-projects/spring-framework/issues/…
标签: java spring spring-boot junit