[Kotlin + Spring] Kotest에 Mockk 적용하기

정지수 JisooJung·2022년 8월 9일
0
post-custom-banner

Kotlin + Spring 프로젝트에서 kotest와 mockk을 이용해 테스트코드를 작성하였다.

Controller

문자열 "hi"를 리턴하는 컨트롤러에 대한 테스트이다.

TestController

@RestController
class TestController {

    @GetMapping("/")
    fun home() = "hi"
}

TestControllerTest

import com.ninjasquad.springmockk.MockkBean
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
... // 생략

@WebMvcTest
@MockkBean(JpaMetamodelMappingContext::class)
class TestControllerTest(@Autowired val mockMvc: MockMvc) : DescribeSpec({
    describe("#home") {
        it("200을 반환한다") {

            mockMvc.get("/") {
                contentType = MediaType.APPLICATION_JSON
                accept = MediaType.APPLICATION_JSON
            }.andExpect {
                status { MockMvcResultMatchers.status().isOk }
                content { contentType(MediaType.APPLICATION_JSON) }
                content { "hi" }
            }
        }
    }
})

Service

Item 레코드의 id를 받아 Item 엔티티를 Dto로 변환해 리턴하는 ItemService#getItem에 대한 테스트코드이다.

ItemService

@Service
class ItemService(
	private val itemRepository: ItemRepository,
    private val itemMapper: ItemMapper
) {

	fun getItem: ItemInfo(itemId: Long) {
    	val item = itemRepository.findById(itemId)
        return itemMapper.of(item)
    }
}

ItemServiceTest

@SpringBootTest
@ExtendWith(MockkExtension::class) // MockkExtension 선언
class ItemServiceTest @Autowired constructor(
	private val itemService: ItemService,
    private val itemMapper: ItemMapper
) : DescribeSpec() {

	@MockkBean
    lateinit var itemRepository: ItemRepository // mock 대상 선언
    
    init {
    	
        describe("#getItem") {
            every { itemRepository.findById(1) } returns item // 동작 정의
                
            it("데이터를 반환한다") {
            	val result = itemService.findById(1)
                result shouldBe itemMapper.of(item) // passed
            }
        }
    }
    
    companion object {
    	private val item = Item(
        					id = 1, 
                            ... //생략
        				)
    }
}
profile
Study&Work&Log
post-custom-banner

0개의 댓글