Kotlin 이용한 Spring에서 MockMVC test를 진행하고 이를 문서화하는 방법을 설명한다.
plugins {
// ...
id("org.asciidoctor.jvm.convert") version "3.3.2"
}
Asciidoctor Plugin을 설치한다.
val snippetsDir by extra { file("build/generated-snippets") }
문서에 들어갈 데이터 (REST 요청의 snippet)가 명시된 asciidoctor가 생성될 디렉토리를 명시한다.
dependencies {
// ...
testImplementation("org.springframework.restdocs:spring-restdocs-asciidoctor")
testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
testImplementation("org.mockito.kotlin:mockito-kotlin:5.3.1")
}
asciidoctor, mockmvc, mockito 를 추가한다.
(mockito는 spring-boot-starter-test에 포함돼있지만 kotlin 버전으로 쓰려면 mockito-kotlin을 추가해야 한다.)
Spring.io initializr로 생성할 때 Spring REST Docs 를 추가했다면 mockito-kotlin 빼곤 다 설정되어 있다.
다음과 같이 basetest 클래스를 작성한다.
@SpringBootTest
@AutoConfigureWebMvc
@ExtendWith(RestDocumentationExtension::class, SpringExtension::class)
abstract class DefaultControllerTest {
val logger = LoggerFactory.getLogger(LabelControllerTest::class.java)!!
lateinit var mockMvc: MockMvc
@BeforeEach
fun setUp(webApplicationContext: WebApplicationContext, restDocumentation: RestDocumentationContextProvider) {
this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
.alwaysDo<DefaultMockMvcBuilder> { it.response.setDefaultCharacterEncoding(StandardCharsets.UTF_8.toString()) }
.apply<DefaultMockMvcBuilder>(
documentationConfiguration(restDocumentation).snippets().withEncoding("UTF-8")
)
.build()
}
}
class AControllerTest: DefaultControllerTest() {
@MockBean
lateinit var someService: SomeService
@Test
fun testOne() {
// given
given(someService.someMethod()).willReturn(true)
// when
val mvcResult = mockMvc.perform(
get("/some/url")
)
.andDo(document("directory/under/generated-snippets"))
.andReturn()
val status = mvcResult.response.status
val body = mvcResult.response.contentAsString
val expected = Gson().fromJson(body, SomeClass::class.java)
// then
assertTrue(status == HttpStatus.OK)
assertTrue(expected.isNotEmpty())
}
}