Kotlin + Spring 프로젝트에서 kotest와 mockk을 이용해 테스트코드를 작성하였다.
문자열 "hi"를 리턴하는 컨트롤러에 대한 테스트이다.
@RestController
class TestController {
@GetMapping("/")
fun home() = "hi"
}
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" }
}
}
}
})
Item 레코드의 id를 받아 Item 엔티티를 Dto로 변환해 리턴하는 ItemService#getItem에 대한 테스트코드이다.
@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)
}
}
@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,
... //생략
)
}
}