RestDoc

김지원·2023년 11월 10일
0

https://helloworld.kurly.com/blog/spring-rest-docs-guide/
https://spring.io/projects/spring-restdocs#samples

통합테스트 필요


https://github.com/codingspecialist/Springboot-Gradle-RestDoc
보고 build.gradle 수정


test에

package com.example.kakao.user;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import com.example.kakao.MyWithRestDoc;
import com.fasterxml.jackson.databind.ObjectMapper;

@AutoConfigureRestDocs(uriScheme = "http", uriHost = "localhost", uriPort = 8081)
// @AutoConfigureMockMvc
@SpringBootTest
public class UserControllerTest extends MyWithRestDoc {

    // @Autowired
    // private MockMvc mvc;

    @Test
    public void join_test() throws Exception {

        // given
        UserRequest.JoinDTO requestDTO =  new UserRequest.JoinDTO();
        requestDTO.setUsername("testcos");
        requestDTO.setPassword("1234");
        requestDTO.setEmail("testcos@nate.com");
        ObjectMapper om = new ObjectMapper();
        String requestBody = om.writeValueAsString(requestDTO);

        System.out.println("================================");
        System.out.println("requestBody"+requestBody);
        System.out.println("================================");



        // when
        ResultActions resultActions = mockMvc.perform(
                MockMvcRequestBuilders
                        .post("/join")
                        .content(requestBody)
                        .contentType(MediaType.APPLICATION_JSON)
        );
        String responseBody = resultActions.andReturn().getResponse().getContentAsString();

        System.out.println("================================");
        System.out.println("responseBody"+responseBody);
        System.out.println("================================");



        // then
        resultActions
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.success").value(true))
                // .andExpect(MockMvcResultMatchers.jsonPath("$.response.id").value(2))
                // .andExpect(MockMvcResultMatchers.jsonPath("$.response.username").value("testcos"))
                // .andExpect(MockMvcResultMatchers.jsonPath("$.response.password").value("1234"))
                // .andExpect(MockMvcResultMatchers.jsonPath("$.response.email").value("testcos@nate.com"))
                .andExpect(MockMvcResultMatchers.jsonPath("$.errorType").isEmpty())
                .andDo(MockMvcResultHandlers.print())
                .andDo(document);
                
    }

    @Test
    // public void userInfo_test() throws Exception { // 이렇게하면 api-docs/adoc에 user-info_test 해야해서 헷갈림
    public void login_test() throws Exception {

        // given
        UserRequest.LoginDTO requestDTO = new UserRequest.LoginDTO();
        requestDTO.setEmail("ssar@naver.com");
        requestDTO.setPassword("1234");
        ObjectMapper om = new ObjectMapper();
        String requestBody = om.writeValueAsString(requestDTO);

        System.out.println("================================");
        System.out.println("requestBody"+requestBody);
        System.out.println("================================");


        // when
        ResultActions resultActions = mockMvc.perform(
                MockMvcRequestBuilders
                        .post("/login")
                        .content(requestBody)
                        .contentType(MediaType.APPLICATION_JSON)
        );
        String responseBody = resultActions.andReturn().getResponse().getContentAsString();

        System.out.println("================================");
        System.out.println("responseBody"+responseBody);
        System.out.println("================================");


        // then
        resultActions
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$.success").value(true))
                .andExpect(MockMvcResultMatchers.jsonPath("$.data.id").value(1))
                .andExpect(MockMvcResultMatchers.jsonPath("$.data.username").value("쌀"))
                .andExpect(MockMvcResultMatchers.jsonPath("$.data.email").value("ssar@naver.com"))
                .andExpect(MockMvcResultMatchers.jsonPath("$.errorType").isEmpty())
                .andDo(MockMvcResultHandlers.print())
                .andDo(document);

    }
}

https://github.com/codingspecialist/Springboot-Gradle-RestDoc
에 추상 테스트 클래스 작성 MyWithRestDoc.java


src/docs/asciidoc/api-docs.adoc

ifndef::snippets[]
:snippets: ./build/generated-snippets
endif::[]

:user: user-controller-test

= REST API
:toc: left
:toclevels: 2
:source-highlighter: highlightjs

== 회원
=== 1. 회원가입
===== Request Example
include::{snippets}/{user}/join_test/http-request.adoc[]

===== Response Example
include::{snippets}/{user}/join_test/http-response.adoc[]

=== 2. 회원정보
===== Request Example
include::{snippets}/{user}/user_info_test/http-request.adoc[]

===== Response Example
include::{snippets}/{user}/user_info_test/http-response.adoc[]

테스트코드 전체테스트 하고나서
./gradlew clean build

안돼면 gradle wrapper
https://velog.io/@joyuna/tool-Gradle-%EC%84%A4%EC%B9%98-Windows-OS
https://velog.io/@jh5253/%EC%98%A4%EB%A5%98-%EA%B8%B0%EB%B3%B8-%ED%81%B4%EB%9E%98%EC%8A%A4-org.gradle.wrapper.GradleWrapperMain%EC%9D%84%EB%A5%BC-%EC%B0%BE%EA%B1%B0%EB%82%98-%EB%A1%9C%EB%93%9C%ED%95%A0-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4


build\docs\asciidoc에 생성


필터 적용방법
내부적으로 실행되는거라 필터를 안거쳐서 jwt 문제

        mockMvcAddFilter = MockMvcBuilders.webAppContextSetup(webApplicationContext)
                .addFilter(new CharacterEncodingFilter(StandardCharsets.UTF_8.name(), true))
                .apply(MockMvcRestDocumentation.documentationConfiguration(restDocumentation))
                // .apply(SecurityMockMvcConfigurers.springSecurity())
                .addFilter(new JwtAuthorizationFilter()) // 이거 안하면 JWT 필터를 아예 패스해버림
                .alwaysDo(document)
                .build();
        ResultActions resultActions = mockMvcAddFilter.perform(
                MockMvcRequestBuilders
                        .get("/webtoons")
                        .header(HttpHeaders.AUTHORIZATION, jwt)
        );

메서드 이름 그냥 언더스코어랑 소문자만

profile
https://github.com/k7850

0개의 댓글

관련 채용 정보