스프링

스프링 컨트롤러 테스트시 responseBody값 파싱하기(w.스프링 컨트롤러 리턴값 한글깨짐해결)

rkrkrr0101 2024. 9. 29. 13:39

 

결과값을 던져주는 클래스는

data class Result<T>(
    val data: T,
)

이렇게생겼고

테스트 통신으로 MockMvc를 사용하고,om을 사용할거임

@SpringBootTest
@Import(TestConfig::class)
@AutoConfigureMockMvc
@Transactional
class MemberControllerTest
    @Autowired
    constructor(
        val mvc: MockMvc,
        val memberRepository: MemberRepository,
        val koreanStockRepository: KoreanStockRepository,
    ) {
        val om = ObjectMapper()

그리고 평범하게 통신테스트를 하면서,mvc통신값을 리턴받고,그걸 원하는형태로 파싱해서 사용하면됨

 

@Test
@DisplayName("멤버에 기록된 한국주식을 조회할수있다")
fun getKoreanStockToMember() {
    InitUtil.basicMemberInit(memberRepository, koreanStockRepository)

    val mvcResult =
        mvc
            .perform(
                MockMvcRequestBuilders
                    .get("/api/member/stock?memberName=member1")
                    .contentType(MediaType.APPLICATION_JSON)
                    .characterEncoding(StandardCharsets.UTF_8),
            ).andExpect(status().isOk)
            .andReturn()
    val content = mvcResult.response.contentAsString
    val resMap = om.readValue(content, Map::class.java)
    val body = (resMap["data"] as List<*>).filterIsInstance<Map<String, Any>>()

    Assertions.assertThat(body.size).isEqualTo(2)
    Assertions.assertThat(body.filter { it["assetName"] == "삼성전자" }.size).isEqualTo(1)
}

즉 해당리스폰스바디를 스트링으로 바꾸고,그걸 om으로 맵<*,*>으로 바꾼다음,거기서 특정 위치까지 파고들어서

( (resMap["data"] as List<*>) ),그걸 다시 맵으로 바꾸면됨

즉 resMap이

{data=[{identityCode=130111-0006246, assetName=삼성전자}, {identityCode=110111-2487050, assetName=LG전자}]}

이면

body는 거기서 data를 벗긴

[{identityCode=130111-0006246, assetName=삼성전자}, {identityCode=110111-2487050, assetName=LG전자}]

가 되는거임

 

그리고 스프링에서 리턴값에서 한글이 깨지면,application.yml이나 프로퍼티에서

server:
  servlet:
    encoding:
      charset: UTF-8
      force-response: true

이걸 메인이랑 테스트에 둘다 추가해주면됨

어짜피 리턴값은 utf-8로 전부 통일하는게 요즘 국룰이니까