MockMvc Test, RestDocumentation

Kyojun Jin·2024년 5월 31일
0

Spring

목록 보기
6/12

Kotlin 이용한 Spring에서 MockMVC test를 진행하고 이를 문서화하는 방법을 설명한다.

공식 문서

build.gradle.kts

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())
    }
}

0개의 댓글