From a18dfdf193cde8611ac27fc0a7d302bd4bb6fff2 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Sun, 7 Aug 2022 01:57:37 +0900 Subject: [PATCH] =?UTF-8?q?[#8]=20Cafe=20=EA=B8=B0=EB=B3=B8=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20Test=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카페 신규 생성시 예외 발생 케이스 테스트 - 카페 정보 변경 및 예외 발생 케이스 테스트 --- .../domain/cafe/service/CafeServiceTest.kt | 150 +++++++++++++++--- 1 file changed, 128 insertions(+), 22 deletions(-) diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index 18daeae..e9a4d81 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -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 { + // 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 { + 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(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 } } \ No newline at end of file