// build.gradle.kts
plugins {
... 생략
id("com.epages.restdocs-api-spec") version "0.15.3"
}
repositories {
mavenCentral()
}
dependencies {
... 생략
// Rest Docs
testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
testImplementation("org.springframework.restdocs:spring-restdocs-asciidoctor")
testImplementation("com.epages:restdocs-api-spec-mockmvc:0.17.1")
... 생략
}
openapi3 {
this.setServer("https://localhost:8080") // list로 넣을 수 있어 각종 환경의 URL을 넣을 수 있음!
title = "My API"
description = "My API description"
version = "0.1.0"
format = "yaml" // or json
}
1-2. task 확인
의존성을 추가하고 gradle의 tasks를 보면 아래 사진처럼 openapi3 과 같은 task가 추가돼있다.
여기서 openapi3 task를 실행해보면 아래 사진처럼 build/api-spec 경로에 openapi3.yaml 파일이 생성된다.
이걸 2에서 생성한 /static/swagger-ui 경로에 넣고 swagger-ui.html로 읽을 것이다.
build.gradle.kts에 아래 코드를 추가하여 이를 위한 task를 추가한다.
// build.gradle.kts
tasks.withType<Test> {
useJUnitPlatform()
// 기존에 있는 test 쪽에 이 코드를 추가
finalizedBy("copyOasToSwagger") // test 후 copyOasToSwagger task 진행
}
val buildDir = layout.buildDirectory.get().asFile
tasks.register<Copy>("copyOasToSwagger") {
dependsOn("openapi3") // openapi3 Task가 먼저 실행되도록 설정
delete("src/main/resources/static/swagger-ui/openapi3.yaml") // 기존 OAS 파일 삭제
from("$buildDir/api-spec/openapi3.yaml") // 복제할 OAS 파일 지정
into("src/main/resources/static/swagger-ui/") // 타겟 디렉터리로 파일 복제
}
tasks {
bootJar {
// openapi3.yaml 파일을 /static/swagger-ui 경로로 복사에 성공한 후 bootJar 진행
dependsOn("copyOasToSwagger")
from("build/api-spec") {
into ("BOOT-INF/classes/static/swagger-ui")
}
}
}
위 코드를 추가하고 빌드나 테스트를 돌려서 로그를 살펴보면 아래처럼 task 를 진행함을 확인할 수 있다.
test -> openapi3 -> copyOasToSwagger -> bootJar -> build 의 순서로 task 를 진행한다.
4.Sample Controller 코드 및 Rest Docs 테스트 작성
간단하게 테스트용으로 컨트롤러를 작성하였다.
TestController
@RestController
@RequestMapping("/hi")
public class TestController {
@GetMapping("/hi1")
public String test() {
return "hi1";
}
@GetMapping("/hi2")
public String test2() {
return "hi2";
}
}
TestControllerTest
Spring Rest Docs는 MockMvc 와 결합해서 동작한다.
컨트롤러 테스트 코드를 작성할 때 아래 두 가지를 목적에 맞게 사용해야 한다.
Rest Docs 사용- MockMvcRestDocumentation.document
Swagger 사용 - MockMvcRestDocumentationWrapper.document