[Intellij / 인텔리제이] Spring Test MockMvc의 한글 깨짐
개발 유틸리티/intellij

[Intellij / 인텔리제이] Spring Test MockMvc의 한글 깨짐

[작업환경]

- Intellij 2020.3

- junit 5


테스트 코드를 작성하는 중 한글이 깨지는 현상이 발생했다.

 

소스상에는 장그레라는 한글이름으로 넣었는데 Body에는 ìž¥ê·¸ë ˆ로 결과가 리턴됐다.

@ExtendWith(SpringExtension.class)
@WebMvcTest(UserController.class)
class UserControllerTest {
    @Autowired
    private MockMvc mvc;
    
    
    @Test
    public void create() throws Exception {
        Header mockUserRequest = Header.builder().data(user).build();
        given(userService.create(any())).willReturn(mockUserRequest);

        mvc.perform(post("/v1/api/user")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"id\":\"10\", \"email\":\"single@test.com\", \"name\":\"장그레\", \"account\":\"single\", \"password\":\"1111\"}"))
                .andExpect(status().isOk())
                .andExpect(content().string(containsString("장그레")));
    }
}

한글이 깨져서 에러가 발생


구글링을 해보는 중 2가지 방법이 있다는 것을 확인했다.

 

1. @SpringBootTest를 써야하는 경우 [ @WebMvcTest에서도 정상 동작 ] 
   1.1. 아래의 코드를 보면 WebApplicationContext를 @Autowired로 주입받는다.
   1.2. @BeforeEach을 사용해서 테스트 코드가 실행될 때, mvc에 EncodingFilter를 추가? / 변경? 해준다.

@ExtendWith(SpringExtension.class)
@WebMvcTest(UserController.class)
class UserControllerTest {
    @Autowired
    private MockMvc mvc;

    @Autowired
    private WebApplicationContext ctx;
    
    @BeforeEach
    public void setUp(){
        //MockMvc 설정
        this.mvc = MockMvcBuilders.webAppContextSetup(ctx)
                .addFilters(new CharacterEncodingFilter("UTF-8", true))  // 필터 추가
                .alwaysDo(print())
                .build();
      
      
      
    @Test
    public void create() throws Exception {
        Header mockUserRequest = Header.builder().data(user).build();
        given(userService.create(any())).willReturn(mockUserRequest);

        mvc.perform(post("/v1/api/user")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"id\":\"10\", \"email\":\"single@test.com\", \"name\":\"장그레\", \"account\":\"single\", \"password\":\"1111\"}"))
                .andExpect(status().isOk())
                .andExpect(content().string(containsString("장그레")));
    }
}

 

 

2.  application.yml 파일에 아래의 설정을 추가한다.

server:
  servlet:
    encoding:
      force-response: true

 

 

출처: 

https://github.com/HomoEfficio/dev-tips/blob/master/Spring%20Test%20MockMvc%EC%9D%98%20%ED%95%9C%EA%B8%80%20%EA%B9%A8%EC%A7%90%20%EC%B2%98%EB%A6%AC.md

 

HomoEfficio/dev-tips

개발하다 마주쳤던 작은 문제들과 해결 방법 정리. Contribute to HomoEfficio/dev-tips development by creating an account on GitHub.

github.com