【问题标题】:Response from JUnit is different then normal responseJUnit 的响应与正常响应不同
【发布时间】: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


【解决方案1】:

您可以在MockMvcBuilders中设置如下字符编码

  @Before
  public void setUp() {
    mockMvc = MockMvcBuilders
        .webAppContextSetup(webApplicationContext)
        .addFilter((request, response, chain) -> {
          response.setCharacterEncoding("UTF-8"); // this is crucial
          chain.doFilter(request, response);
        }, "/*")
        .build();
  }

或者,您可以覆盖WebMvcConfigurer,如下所示

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(UTF_8));
    }

【讨论】:

  • response.setCharacterEncoding() 不会将 ;charset=UTF8 附加到响应类型。
  • 好的..你能试试其他的吗
  • 不过,这完全回避了 OP 打算测试的内容
猜你喜欢
  • 2021-08-04
  • 2020-07-17
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2022-07-06
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多