Spring Rest Docs를 사용하여 PUT을 테스트하는 방법에 대해서 알아보겠습니다. GET, POST와 마찬가지로 given, when, then의 순서로 설명하겠습니다.
//given
Address addressA = new Address("경기도", "테스트", "53-123");
Member member = Member.createMember("아무개", "010-6541-9815", addressA);
em.persist(member);
Address addressB = new Address("서울", "테스트", "53-123");
Map<String, Object> map = new HashMap<>();
map.put("address", addressB);
map.put("phone", "010-1111-2222");
PUT의 경우 이미 등록된 member의 정보를 수정하는 것이기 때문에 given 단계에서 EntityManager를 사용하여 member를 저장해줍니다. member의 경우 주소와 핸드폰 번호를 변경할 수 있기 때문에 map에는 새로운 주소와 핸드폰 번호를 저장해줍니다.
//when
ResultActions result = mockMvc.perform(put("/api/v1/member/" + member.getId())
.contentType(MediaType.APPLICATION_JSON)
.characterEncoding("UTF-8")
.content(objectMapper.writeValueAsString(map)));
perform을 사용하여 테스트를 진행하고 싶은 method와 uri를 설정해줍니다. PUT의 경우 member의 id를 uri를 통해 넘겨주어야 하기 때문에 uri 설정의 마지막 부분에 member.getId()를 잊지 말고 설정해줍니다. given 단계에서 저장했던 map의 값을 objectMapper를 사용하여 json 형태로 변환될 수 있도록 합니다.
//then
result.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(member.getId()))
.andExpect(jsonPath("$.phone").value(member.getPhone()))
.andExpect(jsonPath("$.address.city").value(member.getAddress().getCity()))
.andExpect(jsonPath("$.address.street").value(member.getAddress().getStreet()))
.andExpect(jsonPath("$.address.zipcode").value(member.getAddress().getZipcode()))
.andDo(document("PUT-member",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint()),
requestFields(
fieldWithPath("phone").type(JsonFieldType.STRING).description("멤버의 핸드폰 번호"),
fieldWithPath("address.city").type(JsonFieldType.STRING).description("멤버의 도시"),
fieldWithPath("address.street").type(JsonFieldType.STRING).description("멤버의 도로명"),
fieldWithPath("address.zipcode").type(JsonFieldType.STRING).description("멤버의 zipcode")
)));
UpdateMemberResponse에는 id, phone, address를 반환하기 때문에 andExpect를 통해서 id, phone, address를 모두 비교하여 넘겨준 데이터와 같은 값인지 확인해줍니다. andExpect의 값에 이상이 없다면 document를 통해서 .adoc을 저장할 폴더의 이름, test request 데이터, test response 데이터 그리고 request 요청 시 필요한 데이터의 경로, 타입, 설명들을 설정해줍니다.
결과로 나온 .adoc 파일을 통해 문서를 생성하면 다음 그림과 같은 결과를 얻을 수 있습니다. (🧨 다음의 결과는 테스트의 일부입니다)
'Java, JavaScript > Spring Boot' 카테고리의 다른 글
[Spring Boot] dto의 toEntity를 어떻게 사용해야할까? (0) | 2021.12.23 |
---|---|
[Error] ids for this class must be manually assigned before calling save() (1) | 2021.11.09 |
[Spring Boot] Spring Rest Docs 사용하기 - POST (0) | 2021.09.16 |
[Spring Boot] Spring Rest Docs 사용하기 - GET (0) | 2021.09.13 |
[Spring Boot] POST 요청을 사용하여 Entity 생성하기 (0) | 2021.09.10 |