쌩로그

Test코드 작성시 Post를 작성한다면, Map을 사용해보자. 본문

TroubleShooting & 고민/BE

Test코드 작성시 Post를 작성한다면, Map을 사용해보자.

.쌩수. 2023. 7. 24. 12:30
반응형

목록

  1. 포스팅 개요
  2. 본론
      2-1. 문제 발생
      2-2. 문제 해결 방향
      2-3. 문제 해결
  3. 요약

1. 포스팅 개요

PostDto로 LocalDate를 받을 때 다음과 같은 코드로 (비슷하게) 작성되어있다.

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate localDate;

Spring Rest Docs를 이용해서 API문서를 작성하려고 하는데,
Gson 라이브러리의 Gson객체로 toJson()메서드를 이용해서 자바코드로 생성된 클래스를 JSON으로 파싱했다.

JSON으로 변환한 데이터는 API 문서에 정보를 넣어줄 때 다음과 같이 content에 넣는다.

이 때 PostDto를 생성할 때 LocalDate 값을 넣어주는데,
그냥 생성자 혹은 빌더패턴을 사용하더라도, 파싱할 때 계속 문제가 발생했었다.

이 때 Map을 이용하여 이를 해결했다.
(참고 블로그가 있었는데,,,어딘지 모르겠다...)

2. 본론

2-1. 문제 발생

문제는 다음과 같다.

PostDto post = Post.builder()
.local("부산")
.maxMemberNum(3L)
.accompanyStartDate(LocalDate.of(2023,7,23))
.accompanyEndDate(LocalDate.of(2023,8,2))
.title("동행 생성 제목")
.content("동행 생성 본문")
.coordinateX(0.15)
.coordinateY(1.24)
.placeName("동행 장소")
.build();

String accompanyPostToJson = gson.toJson(post);

...
...
...
...

// when  
ResultActions actions =  
        mockMvc.perform(  
                post(BASE_URL)  
                        .accept(MediaType.APPLICATION_JSON)  
                        .contentType(MediaType.APPLICATION_JSON)  
                        .with(csrf())  
                        .content(accompanyPostToJson)  /// 문제 발생 코드
                        .headers(GenerateMockToken.getMockHeaderToken())  
        );

위의 코드처럼 Dto를 생성하고, JSON으로 파싱해서 ControllerTest의 content에 RequestBody의 정보로 넣어주었다.

하지만, JSON형식에 맞지 않는다고 Test에 실패했다.

JSON으로 받게 한 패턴은
"yyyy-MM-dd"인데,
위의 데이터로 하자면, "2023-07-23" 이런 형태의 패턴이다.

하지만, 결국 LocalDate는 자바로 저장되기 때문에,
아무리 JSON형태로 변환하려해도(예를 들어 String타입을 파싱) LocalDate를 그냥 넣거나 하더라도 값이 제대로 들어가지 않았다.

2-2. 문제 해결 방향

따라서, JSON과 같은 형태로 값이 들어가게 하도록 해야했다.
결국 문자열로 들어가야 했는데, 관련 자료를 구글링해보니 어떤 누군가가
Map을 이용해서 Dto클래스를 생성했고,
이를 JSON으로 변환하여 사용하는 것을 보았다.
그래서 Map을 사용하여 이를 해결했다.

2-3. 문제 해결

아래는 문제 해결 코드이다.

LocalDateTime createAt = TIME;  
LocalDateTime modifiedAt = LocalDateTime.now();  

Map<String, Object> postMap = new HashMap<>();  //  
postMap.put("local", "부산");  
postMap.put("maxMemberNum", 3L);  
postMap.put("accompanyStartDate", "2023-07-23");  
postMap.put("accompanyEndDate", "2023-08-02");  
postMap.put("title", "동행 생성 제목");  
postMap.put("content", "동행 생성 본문");  
postMap.put("coordinateX", 0.15);  
postMap.put("coordinateY", 0.15);  
postMap.put("placeName", "동행 장소");  

String accompanyPostToJson = gson.toJson(postMap);

...
...
...
...

// when  
ResultActions actions =  
        mockMvc.perform(  
                post(BASE_URL)  
                        .accept(MediaType.APPLICATION_JSON)  
                        .contentType(MediaType.APPLICATION_JSON)  
                        .with(csrf())  
                        .content(accompanyPostToJson)  
                        .headers(GenerateMockToken.getMockHeaderToken())  
        );

이처럼 Map을 사용해서 JSON과 같은 형태로 값이 들어가게 해서 JSON 파싱이 원활하게 진행되도록 했다.
그리고 Post뿐만 아니라, Patch에도 다음과 같이 적용했는데, 그 결과 모든 테스트를 통과하고, REST DOCS를 생성할 수 있었다.

3. 요약

Controller Test 코드 작성시 JSON으로 파싱했던 데이터가,
Controller 요청정보에 넣을 때,
JSON으로 변환한 데이터로 인해 데이터 형식이 맞이 않아 문제가 발생했고,
이를 Map으로 해결한 포스팅이다.

728x90
Comments