[#8] Cafe 기본적인 Test 구성
- 카페 신규 생성시 예외 발생 케이스 테스트 - 카페 정보 변경 및 예외 발생 케이스 테스트
This commit is contained in:
@@ -1,22 +1,30 @@
|
||||
package io.beaniejoy.dongnecafe.domain.cafe.service
|
||||
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.dto.request.MenuOptionInfoRequestDto
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.dto.request.OptionDetailInfoRequestDto
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.error.CafeExistedException
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException
|
||||
import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import org.junit.jupiter.api.MethodOrderer
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.TestMethodOrder
|
||||
import org.junit.jupiter.api.assertThrows
|
||||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
import org.mockito.InjectMocks
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito.*
|
||||
import org.mockito.junit.jupiter.MockitoExtension
|
||||
import java.math.BigDecimal
|
||||
import java.util.*
|
||||
import javax.persistence.GeneratedValue
|
||||
|
||||
@ExtendWith(MockitoExtension::class)
|
||||
@TestMethodOrder(MethodOrderer.DisplayName::class)
|
||||
internal class CafeServiceTest {
|
||||
@InjectMocks
|
||||
lateinit var mockCafeService: CafeService
|
||||
@@ -26,7 +34,111 @@ internal class CafeServiceTest {
|
||||
|
||||
@Test
|
||||
@DisplayName("카페 신규 생성 테스트")
|
||||
fun createCafeTest() {
|
||||
fun create_cafe_test() {
|
||||
// given
|
||||
val cafeRequestDto = createCreateCafeRequestDto()
|
||||
val savedMockCafeId = 100L
|
||||
|
||||
`when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null)
|
||||
`when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer {
|
||||
injectCafeId(it.getArgument(0), savedMockCafeId)
|
||||
}
|
||||
|
||||
// when
|
||||
val savedCafeId = mockCafeService.createCafe(
|
||||
name = cafeRequestDto.name!!,
|
||||
address = cafeRequestDto.address!!,
|
||||
phoneNumber = cafeRequestDto.phoneNumber!!,
|
||||
description = cafeRequestDto.description!!,
|
||||
cafeMenuRequestList = cafeRequestDto.cafeMenuList
|
||||
)
|
||||
|
||||
// then
|
||||
verify(mockCafeRepository).findByName(cafeRequestDto.name!!) // TODO eq 에러 발생 이유
|
||||
verify(mockCafeRepository).save(any(Cafe::class.java))
|
||||
|
||||
assertEquals(savedCafeId, savedMockCafeId)
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트")
|
||||
fun fail_create_cafe_when_existed() {
|
||||
// given
|
||||
val cafeRequestDto = createCreateCafeRequestDto()
|
||||
val cafe = Cafe.createCafe(
|
||||
name = cafeRequestDto.name!!,
|
||||
address = cafeRequestDto.address!!,
|
||||
phoneNumber = cafeRequestDto.phoneNumber!!,
|
||||
description = cafeRequestDto.description!!,
|
||||
cafeMenuRequestList = cafeRequestDto.cafeMenuList
|
||||
)
|
||||
|
||||
`when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(cafe)
|
||||
|
||||
// then
|
||||
assertThrows<CafeExistedException> {
|
||||
// when
|
||||
mockCafeService.createCafe(
|
||||
name = cafeRequestDto.name!!,
|
||||
address = cafeRequestDto.address!!,
|
||||
phoneNumber = cafeRequestDto.phoneNumber!!,
|
||||
description = cafeRequestDto.description!!,
|
||||
cafeMenuRequestList = cafeRequestDto.cafeMenuList
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("카페 정보 변경 테스트")
|
||||
fun update_cafe_test() {
|
||||
// given
|
||||
val cafeRequestDto = createCreateCafeRequestDto()
|
||||
val cafe = Cafe.createCafe(
|
||||
name = cafeRequestDto.name!!,
|
||||
address = cafeRequestDto.address!!,
|
||||
phoneNumber = cafeRequestDto.phoneNumber!!,
|
||||
description = cafeRequestDto.description!!,
|
||||
cafeMenuRequestList = cafeRequestDto.cafeMenuList
|
||||
)
|
||||
val cafeId = 50L
|
||||
|
||||
// TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯
|
||||
`when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe))
|
||||
|
||||
// then
|
||||
mockCafeService.updateCafe(
|
||||
id = cafeId,
|
||||
name = "",
|
||||
address = "",
|
||||
phoneNumber = "",
|
||||
description = "",
|
||||
)
|
||||
|
||||
verify(mockCafeRepository).findById(eq(cafeId))
|
||||
|
||||
// TODO update TEST 방법?
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("카페 정보 변경시 존재하지 않는 카페 예외 발생 테스트")
|
||||
fun fail_update_cafe_when_not_found() {
|
||||
// given
|
||||
val cafeId = 50L
|
||||
|
||||
`when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.empty())
|
||||
|
||||
assertThrows<CafeNotFoundException> {
|
||||
mockCafeService.updateCafe(
|
||||
id = cafeId,
|
||||
name = "",
|
||||
address = "",
|
||||
phoneNumber = "",
|
||||
description = "",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createCreateCafeRequestDto(): CafeInfoRequestDto {
|
||||
val cafeName = "beanie_cafe"
|
||||
val cafeAddress = "beanie_cafe_address"
|
||||
val phoneNumber = "01012345678"
|
||||
@@ -55,33 +167,27 @@ internal class CafeServiceTest {
|
||||
),
|
||||
)
|
||||
|
||||
val savedMockCafeId = 100L
|
||||
|
||||
`when`(mockCafeRepository.findByName(cafeName)).thenReturn(null)
|
||||
`when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer {
|
||||
val argument = it.getArgument<Cafe>(0)
|
||||
val idField = argument.javaClass.declaredFields
|
||||
.find { f ->
|
||||
f.getAnnotation(GeneratedValue::class.java) != null
|
||||
} ?: return@thenAnswer argument
|
||||
|
||||
idField.isAccessible = true
|
||||
idField.set(argument, savedMockCafeId)
|
||||
|
||||
return@thenAnswer argument
|
||||
}
|
||||
|
||||
val savedCafeId = mockCafeService.createCafe(
|
||||
return CafeInfoRequestDto(
|
||||
name = cafeName,
|
||||
address = cafeAddress,
|
||||
phoneNumber = phoneNumber,
|
||||
description = description,
|
||||
cafeMenuRequestList = cafeMenuList
|
||||
cafeMenuList = cafeMenuList
|
||||
)
|
||||
}
|
||||
|
||||
verify(mockCafeRepository).findByName(cafeName)
|
||||
verify(mockCafeRepository).save(any(Cafe::class.java))
|
||||
private fun injectCafeId(
|
||||
cafe: Cafe,
|
||||
newCafeId: Long,
|
||||
): Cafe {
|
||||
val idField = cafe.javaClass.declaredFields
|
||||
.find { f ->
|
||||
f.getAnnotation(GeneratedValue::class.java) != null
|
||||
} ?: return cafe
|
||||
|
||||
assertEquals(savedCafeId, savedMockCafeId)
|
||||
idField.isAccessible = true
|
||||
idField.set(cafe, newCafeId)
|
||||
|
||||
return cafe
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user