1. Facts(사실, 객관)
- 토이프로젝트 파일업로드 테스트코드 작성
- 할인 설정 조직 선택 화면 설계 변경
2. Feelings(느낌, 주관)
일반적으로 Controller에서 POST 요청은 appilcation/json을 Content-Type으로 해서 Body에 내용을 담아 요청합니다. 하지만, 첨부파일의 경우 multipart/form-data Content-Type을 설정해서 보내는데, Body에 내용을 담지 않는다. 따라서, 계정 생성시, 이미지를 첨부하는 요청의 경우 어떻게 테스트해야할지 굉장히 난감하였습니다. 그러던 와중에, MockMultipartFile을 알게되었고 해당 방식으로 테스트를 진행하 수 있었다. 또한 응답body에서 또다른 객체 안에 있는 데이터를 어떻게 검색해야하나 고민했는데, jsonPath에서 $를 이용해서 is()로 검사했습니다. 조금씩만 더 생각하고 고민해보면 대부분 해결책이 있음을 다시 깨닫습니다.
할인 설정 조직 선택화면에서 해당 조직 선택과 하위조직 선택을 나누어야 한다는 새로운 정보를 알았습니다 이전에는 그냥 해당 조직을 선택하면 자동으로 하위 조직도 선택하는 설계를 하였는데 잘못하였습니다. 생각보다 친절하게 인수인계 받지 않고 작업하다보니 빚어진 오해였습니다. 그동안 시간을 낭비하지 않았나 생각도 했지만, 그것보다 다음에는 좀 더 많이 물어보고 질문을 주저하지 말자는 생각을 했습니다. 열심히 내가 먼저 확인하고 혹시 우려사항은 없는지, 어떤 특이점이 있는지 물어보다보면 더 명료하게 확인이 가능합니다.
3. Findings (배운 점)
Controoler에서 MultipartFile을 테스트 하기 위해서 MockMultipartFile을 다음과 같이 사용한다.
mockMultipartFile = new MockMultipartFile(
"uploadFile", FILE_CREATED_ORIGINAL_NAME, IMAGE_CONTENT_TYPE, "test data".getBytes()
);
*매개변수 들어가는 값
Controller에서 내가 받고 있는 MultipartFile 변수명
파일 originalFileName
Content-Type
사진 content
mockMvc.perform(
multipart("/api/users")
.file(mockMultipartFile)
.contentType("multipart/form-data")
.param("name", ACCOUNT_CREATED_NAME)
.param("email", ACCOUNT_CREATED_EMAIL)
.param("nickname", ACCOUNT_CREATED_NICKNAME)
.param("password", ACCOUNT_CREATED_PASSWORD)
.param("authenticationNumber", ACCOUNT_CREATED_AUTHENTICATION_NUMBER)
)
mockMvc로 요청을 할 때 Http Method가 아닌 multipart를 사용한다. file안에 미리 만들어 둔 mockMultipartFile을 넣는다. 추가적으로 데이터를 같이 보내고 싶으면 param을 이용한다. 참고로 .file()의 경우 null이 들어갈 수 없다.
*jsonPath 이용하여 검증하기
Body = {"id":5,"name":"accountFileName","email":"accountFileEmail","nickname":"accountFileNickname","password":"accountFilePassword","deleted":false,
"uploadFileResultDto":{"id":3,"fileName":"createdFileName.jpg","fileOriginalName":"createdOriginalName.jpg","fileUrl":"createdFileUrl"}}
응답 Body도 객체이지만, 그 안에 또 객체가 있다면 단순히 jsonPath와 value를 통해 비교하는 것이 불가능하다.
따라서 이럴때는 jsonPath의 $와 is()를 사용하여 객체 안에 접근할 수 있다.
.andExpect(jsonPath("$.uploadFileResultDto.fileName",
is(uploadFileResultDto.getFileName())))
.andExpect(jsonPath("$.uploadFileResultDto.fileOriginalName",
is(uploadFileResultDto.getFileOriginalName())))
import를 주의하고 발견하지 못하면 수동으로 한다.
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
4. Affirmation (자기 선언)
나는 테스트 코드 작성으로 내 코드를 안전하게 관리하는 사람이다.
'회고' 카테고리의 다른 글
TIL_211205 (0) | 2021.12.06 |
---|---|
TIL_211203 (0) | 2021.12.04 |
TIL_211201 (0) | 2021.12.01 |
TIL_211130 (0) | 2021.12.01 |
TIL_211128 (0) | 2021.11.29 |