티스토리 뷰

우테코 레벨4 프로젝트 과정에서 정리한 Wiki 문서

본 문서는 Spring Rest Docs + @SpringBootTest + WebTestClient 버전의 예제로 설명

참고자료

Rest Docs 도입 배경


과정

build.gradle에 Configuration 추가

  • Spring Boot라면 버전 생략 가능
  • testCompile 'org.springframework.restdocs:spring-restdocs-mockmvc:{project-version}' 부분 사용하는 테스트 객체에 맞게 변경 (MockMvc, WebTestClient, REST Assured)
  • 아래는 필요한 의존성. (test 디렉토리가 아닌, 별도로 생성한 acceptanceTest라는 디렉토리에서 구현중이라서 acceptanceTestImplementation으로 되어있음)

Spring%20Rest%20Docs%20API/Untitled.pngSpring%20Rest%20Docs%20API/Untitled%201.png

build.gradle에 bootJar 추가

Spring%20Rest%20Docs%20API/Untitled%202.png

JUnit 5 기준

Spring%20Rest%20Docs%20API/Untitled%203.pngSpring%20Rest%20Docs%20API/Untitled%204.png

API에 맞게 테스트 작성 (ArticeController 예제)

  • docs처럼 bindToApplicationContext()가 아닌 bindToServer()를 이용해 webtestclient를 초기화해야 spring mvc의 bean 인식 가능
  • responseFields안에 필드 명시하는 방법들
    • fieldWithPath : 기본적으로 필드 명시
    • subsectionWithPath : 깊이 들어가지않고 high-level로 표현가능. 보통 dto같은 직접만든 객체 표현할때 유용
    • fieldWithPath("exampleField").description("Text").optional() : 값이 null이거나 없을수도있으면 optional() 등..
    • 다양한 방법이 있다. docs 해당 부분 참고

Spring%20Rest%20Docs%20API/Untitled%205.png

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
@AutoConfigureRestDocs(uriScheme = "https", uriHost = "docs.api.com")
public class ArticleControllerTest {

    private WebTestClient webTestClient;

//    @BeforeEach
//    public void setUp(ApplicationContext applicationContext, RestDocumentationContextProvider restDocumentation) {
//        this.webTestClient = WebTestClient.bindToApplicationContext(applicationContext)
//                .configureClient()
//                .filter(documentationConfiguration(restDocumentation))
//                .build();
//    }

    @BeforeEach
    public void setUp(RestDocumentationContextProvider restDocumentation) {
        webTestClient = WebTestClient.bindToServer()
                .baseUrl("http://localhost:8080")
                .filter(documentationConfiguration(restDocumentation))
                .build();
    }

    @Test
    void example() {
        this.webTestClient.get().uri("/").accept(MediaType.APPLICATION_JSON)
                .exchange().expectStatus().isOk().expectBody()
                .consumeWith(document("index",
                        responseFields(
                                fieldWithPath("title").description("this is title."),
                                fieldWithPath("contents").description("this is contents."))));
    }
}
@RestController
public class ArticleController {
    @GetMapping("/")
    public ArticleDto test() {
        ArticleDto articleDto = new ArticleDto("ex-title", "ex-contents");
        return articleDto;
    }
}
public class ArticleDto {
    private String title;
    private String contents;

    public ArticleDto() {
    }

    public ArticleDto(String title, String contents) {
        this.title = title;
        this.contents = contents;
    }

    // 생략
}

src/docs/asciidoc/api-docs.adoc 위치로 문서 작성

Spring%20Rest%20Docs%20API/Untitled%206.png

테스트를 돌리면 build/generated-snippets에서 생성된 스니펫 확인 가능

Spring%20Rest%20Docs%20API/Untitled%207.png

build.gradle의 bootJar을 실행시키면 build/asciidoc/html5 (build.gradle에서 우리가 설정한 경로) 에서 생성된 HTML파일 확인가능

Spring%20Rest%20Docs%20API/Untitled%208.pngSpring%20Rest%20Docs%20API/Untitled%209.png

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함