Ответ от JUnit отличается от обычного ответа - PullRequest
0 голосов
/ 05 августа 2020

Текущий стек технологий:

  • Spring Boot 2.3.2
  • JUnit5
  • Mock Mvc

В моем приложении .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 и имитирую mvc, но я предполагаю, что mvc на самом деле не отправляет HTTP-запрос? Значит, он не проходит через сервлет для добавления кодировки?

Как я могу заставить его добавить кодировку? Я знаю, что могу просто принять тип, отличный от UTF8, но я хочу проверить, что получит реальный мир.

EDIT: Mock mvc создается как:

public ControllerTestsBase(WebApplicationContext webApplicationContext,
                           FilterChainProxy springSecurityFilterChain) {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
        .addFilter(springSecurityFilterChain)
        .build();
}

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете установить кодировку символов, как показано ниже, в 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));
    }
...