회원 등록 핸들러 메서드에 대한 슬라이스 테스트를 진행하고, 그 결과를 문서화 해본다.
package com.codestates.slice.controller.docs;
import com.codestates.member.controller.MemberController;
import com.codestates.member.dto.MemberDto;
import com.codestates.member.entity.Member;
import com.codestates.member.mapper.MemberMapper;
import com.codestates.member.service.MemberService;
import com.codestates.stamp.Stamp;
import com.codestates.util.ApiDocumentUtils;
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext;
import org.springframework.http.MediaType;
import org.springframework.restdocs.payload.JsonFieldType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import java.util.List;
import static org.mockito.BDDMockito.given;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
import static org.springframework.restdocs.payload.PayloadDocumentation.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.hamcrest.Matchers.is;
@WebMvcTest(MemberController.class)
@MockBean(JpaMetamodelMappingContext.class)
@AutoConfigureRestDocs
public class MemberControllerRestDocsTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private Gson gson;
@MockBean
private MemberService memberService;
@MockBean
private MemberMapper memberMapper;
@Test
public void postMemberTest() throws Exception {
//given
MemberDto.Post postDto = new MemberDto.Post("[email protected]", "thom", "010-1234-2020");
MemberDto.response responseDto =
new MemberDto.response(1L, "[email protected]", "thom", "010-1234-2020", Member.MemberStatus.MEMBER_ACTIVE, new Stamp());
//(1)
given(memberService.createMember(Mockito.any(Member.class))).willReturn(new Member());
given(memberMapper.memberPostToMember(Mockito.any(MemberDto.Post.class))).willReturn(new Member());
given(memberMapper.memberToMemberResponse(Mockito.any(Member.class))).willReturn(responseDto);
String content = gson.toJson(postDto);
//when
ResultActions resultActions = mockMvc.perform(
post("/v11/members")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(content)
);
//then
resultActions
.andExpect(status().isCreated())
.andExpect(jsonPath("$.data.name").value(postDto.getName()))
.andExpect(jsonPath("$.data.email").value(postDto.getEmail()))
.andExpect(jsonPath("$.data.phone").value(postDto.getPhone()))
.andExpect(jsonPath("$.data.memberStatus").value(Member.MemberStatus.MEMBER_ACTIVE.getStatus()))
.andDo(document( // (2)
"post-member",
ApiDocumentUtils.getDocumentRequest(), // (3)
ApiDocumentUtils.getDocumentResponse(),
requestFields( // (4)
List.of(
fieldWithPath("email").type(JsonFieldType.STRING).description("이메일"),
fieldWithPath("name").type(JsonFieldType.STRING).description("이름"),
fieldWithPath("phone").type(JsonFieldType.STRING).description("전화번호")
)
),
responseFields( // (5)
List.of(
fieldWithPath("data").type(JsonFieldType.OBJECT).description("응답 데이터"),
fieldWithPath("data.memberId").type(JsonFieldType.NUMBER).description("회원 식별자"),
fieldWithPath("data.email").type(JsonFieldType.STRING).description("이메일"),
fieldWithPath("data.name").type(JsonFieldType.STRING).description("이름"),
fieldWithPath("data.phone").type(JsonFieldType.STRING).description("전화번호"),
fieldWithPath("data.memberStatus").type(JsonFieldType.STRING).description("회원 상태"),
fieldWithPath("data.stamp").type(JsonFieldType.NUMBER).description("스탬프 갯수")
)
)
));
}
}
new Member()
로 처리해주었다. service에서 처리된 응답은 우리가 원하는 대로 회원등록이 되었는지 확인하는 데이터가 넘어오는 것이므로 이 부분은 원하는 값으로 stubbing 해준다.테스트가 통과되면 지정한 디렉토리에 identifier로 폴더가 생성되고, 요청 응답에 해당하는 스니펫이 생성된다.
Asciidoctor 플러그인을 설치하면 정돈된 문서를 확인할 수 있다.