스프링
스프링 컨트롤러 테스트시 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로 전부 통일하는게 요즘 국룰이니까