Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- CKA 기출문제
- Linux
- MySQL
- mysql 튜닝
- 오블완
- Kubernetes
- Java
- 기록으로 실력을 쌓자
- IntelliJ
- kotlin
- 코틀린 코루틴의 정석
- CKA
- 공부
- 티스토리챌린지
- minikube
- kotlin querydsl
- 정보처리기사 실기
- kotlin coroutine
- kotlin spring
- PETERICA
- CloudWatch
- Spring
- AWS EKS
- 정보처리기사실기 기출문제
- 정보처리기사 실기 기출문제
- Elasticsearch
- APM
- aws
- Pinpoint
- AI
Archives
- Today
- Total
피터의 개발이야기
[kotlin] Springboot - RestController 생성 및 WebMvcTest 본문
Programming/Kotlin
[kotlin] Springboot - RestController 생성 및 WebMvcTest
기록하는 백앤드개발자 2024. 5. 24. 10:10반응형
ㅁ 들어가며
ㅇ spring boot tutorial를 참조하여 나만의 확장 프로그램 만들기를 구현해 보았습니다.
ㅁ RestController 생성
@RestController
@RequestMapping("/api/article")
class ArticleController(private val repository: ArticleRepository) {
@GetMapping("/")
fun findAll() = repository.findAllByOrderByAddedAtDesc()
@GetMapping("/{slug}")
fun findOne(@PathVariable slug: String) =
repository.findBySlug(slug) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "This article does not exist")
}
@RestController
@RequestMapping("/api/user")
class UserController(private val repository: UserRepository) {
@GetMapping("/")
fun findAll() = repository.findAll()
@GetMapping("/{login}")
fun findOne(@PathVariable login: String) =
repository.findByLogin(login) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "This user does not exist")
}
ㅇ 아티클의 목록과 상세 정보, 사용자의 목록과 상세 정보를 조회하는 API를 생성하였습니다.
ㅁ WebMvcTest를 위한 gradle 설정
// webMvcTest
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(module = "mockito-core")
}
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
testImplementation("com.ninja-squad:springmockk:4.0.2")
ㅇ @MockBean주석은 Mockito에만 해당 되므로 Mockk에 유사한 주석을 제공하는 SpringMockK을 활용할 것입니다.
ㅇ build.gradle.kts에 테스트를 위한 의존성을 추가합니다.
ㅁ HttpControllersTests.kt 생성
@WebMvcTest
class HttpControllersTests(@Autowired val mockMvc: MockMvc) {
@MockkBean
lateinit var userRepository: UserRepository
@MockkBean
lateinit var articleRepository: ArticleRepository
@Test
fun `List articles`() {
val johnDoe = User("johnDoe", "John", "Doe")
val lorem5Article = Article("Lorem", "Lorem", "dolor sit amet", johnDoe)
val ipsumArticle = Article("Ipsum", "Ipsum", "dolor sit amet", johnDoe)
every { articleRepository.findAllByOrderByAddedAtDesc() } returns listOf(lorem5Article, ipsumArticle)
mockMvc.perform(get("/api/article/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk)
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("\$.[0].author.login").value(johnDoe.login))
.andExpect(jsonPath("\$.[0].slug").value(lorem5Article.slug))
.andExpect(jsonPath("\$.[1].author.login").value(johnDoe.login))
.andExpect(jsonPath("\$.[1].slug").value(ipsumArticle.slug))
}
@Test
fun `List users`() {
val johnDoe = User("johnDoe", "John", "Doe")
val janeDoe = User("janeDoe", "Jane", "Doe")
every { userRepository.findAll() } returns listOf(johnDoe, janeDoe)
mockMvc.perform(get("/api/user/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk)
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("\$.[0].login").value(johnDoe.login))
.andExpect(jsonPath("\$.[1].login").value(janeDoe.login))
}
}
ㅇ 테스트가 정상적으로 작동하였다.
반응형
'Programming > Kotlin' 카테고리의 다른 글
[kotlin] Kotlin Coroutine의 비동기 처리 장점, RxKotlin의 Callback 지옥 (0) | 2024.05.27 |
---|---|
[kotlin] Springboot - Configuration properties (0) | 2024.05.25 |
[kotlin] Springboot - JPA 의존성 주입 (2) | 2024.05.23 |
[kotlin] Kotlin에서 Java로, Java에서 Kotlin으로 코드 변환 (0) | 2024.05.22 |
[kotlin] Springboot - 나만의 확장 프로그램 만들기 (0) | 2024.05.21 |
Comments