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)
);
메서드 이름 그냥 언더스코어랑 소문자만