새소식

반응형
Spring/SpringRestDocs

[SpringRestDocs] document 작성 상세

  • -
반응형

spring rest doc 작성 코드의 상세 내역을 분석해 보자

 

import static org.mockito.ArgumentMatchers.any;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields;
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
import static org.springframework.restdocs.snippet.Attributes.key;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

    @Test
    void test() throws Exception {
        BDDMockito.given(testService.test(any()))
                  .willReturn(Mono.just(new TestResult("123")));
        TestParam param = createParam();

        this.mockMvc.perform(RestDocumentationRequestBuilders.post("/test")
                                                             .content(objectMapper.writeValueAsString(param))
                                                             .contentType(MediaType.APPLICATION_JSON))
                    .andExpect(status().is2xxSuccessful())
                    .andDo(document("test/mytest1",
                                    requestFields(
                                        fieldWithPath("id").description("회원 id"),
                                        fieldWithPath("message").description("메세지"),
                                        fieldWithPath("test.name").optional().description("이름")
                                    ),
                                    responseFields(
                                        fieldWithPath("returnCode").description("응답코드"),
                                        fieldWithPath("returnMessage").description("API 응답 메시지")
                                    )));
    }

    private TestParam createParam() {
        return TestParam.builder()
                                .id("00000000-0000-0000-000000000000")
                                .message("message 123")
                                .build();
    }

 

BDDMockito

        BDDMockito.given(testService.test(any()))
                  .willReturn(Mono.just(new TestResult("123")));

TestController에 "/test"를 호출하면 내부적으로 testService를 호출하고 해당 응답이 testController에 영향을 미치게 되므로

Controller Layer 테스트에 필요한 값을 Mocking 해두는 작업

 

MockMvc

        this.mockMvc.perform(post("/test")
                              .content(objectMapper.writeValueAsString(param))
                              .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().is2xxSuccessful())
            .andDo(document("test/mytest1",...
                    ));

mockMvc.perform를 통해 testController의 테스트 메서드 호출

해당 과정에서 필요한 content, type 등을 채워 넣어주어야 한다

andExpect : perform 이후에는 수행 후 어떠한 결과가 나타나길 기대하는지 작성 

후에 spring rest docs를 이용해 api 문서 작성을 위한 코드 작성

 

Document

.andDo(document("test/mytest1",
                requestFields(
                    fieldWithPath("id").description("회원 id"),
                    fieldWithPath("message").description("메세지"),
                    fieldWithPath("test.name").optional().description("이름")
                ),
                responseFields(
                    fieldWithPath("returnCode").description("응답코드"),
                    fieldWithPath("returnMessage").description("API 응답 메시지")
                )));

document( "..",..) 어떠한 디렉터리에 어떠한 이름으로 산출물을 나오게 할 것인지 설정

requestFields(...) 해당 요청에 어떠한 requestBody를 사용하는지 정의 

responseFields(...) 해당 요청의 응답으로 어떠한 응답값을 주는지 정의 

 

attributes


.andDo(document("test/mytest1",
                requestFields(
                    fieldWithPath("id").description("회원 id")
                        .attributes(key("defaultValue").value("testU")
                )

만약 추가적인 정보를 requestField에 추가하고 싶다면 attributes라는 메서드를 이용해 추가할 수 있다

key : 추가할 컬럼 정의

value : 해당 컬럼의 값 

 

추가적으로 해당 정보를 snippet에 나타나게 하고 싶은 경우 추가를 원하는 snippet format에 해당 정보를 추가해주어야 한다

===== Request Fields
|===
|필드명|타입|필수값|기본값|설명

{{#fields}}
|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}}
|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}}
|{{#tableCellContent}}{{^optional}}true{{/optional}}{{/tableCellContent}}
|{{#tableCellContent}}{{#defaultValue}}{{.}}{{/defaultValue}}{{/tableCellContent}}
|{{#tableCellContent}}{{description}}{{/tableCellContent}}

{{/fields}}
|===
반응형

'Spring > SpringRestDocs' 카테고리의 다른 글

[SpringRestDocs] Spring REST Docs이란 & 사용해보기  (0) 2023.10.21
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.