postMember()

회원 등록 핸들러 메서드에 대한 슬라이스 테스트를 진행하고, 그 결과를 문서화 해본다.

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("스탬프 갯수")
                                )
                        )

                ));

    }

}

테스트가 통과되면 지정한 디렉토리에 identifier로 폴더가 생성되고, 요청 응답에 해당하는 스니펫이 생성된다.

Untitled

Asciidoctor 플러그인을 설치하면 정돈된 문서를 확인할 수 있다.

Untitled