diff --git a/src/test/kotlin/roomescape/member/controller/MemberControllerTest.kt b/src/test/kotlin/roomescape/member/controller/MemberControllerTest.kt index 7a8cb84f..d7a55fbc 100644 --- a/src/test/kotlin/roomescape/member/controller/MemberControllerTest.kt +++ b/src/test/kotlin/roomescape/member/controller/MemberControllerTest.kt @@ -1,15 +1,19 @@ package roomescape.member.controller +import com.ninjasquad.springmockk.MockkBean +import com.ninjasquad.springmockk.SpykBean import io.kotest.assertions.assertSoftly import io.kotest.matchers.collections.shouldContainAll import io.kotest.matchers.shouldBe import io.mockk.every -import io.mockk.mockk import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.test.web.servlet.MockMvc import roomescape.auth.exception.AuthErrorCode +import roomescape.member.business.MemberService import roomescape.member.exception.MemberErrorCode +import roomescape.member.exception.MemberException +import roomescape.member.implement.MemberWriter import roomescape.member.infrastructure.persistence.Role import roomescape.member.web.MemberController import roomescape.member.web.MemberRetrieveListResponse @@ -23,11 +27,18 @@ class MemberControllerTest( @Autowired private val mockMvc: MockMvc ) : RoomescapeApiTest() { + @SpykBean + private lateinit var memberService: MemberService + + @MockkBean + private lateinit var memberWriter: MemberWriter + + init { given("GET /members 요청을") { val endpoint = "/members" - every { memberRepository.findAll() } returns listOf( + every { memberFinder.findAll() } returns listOf( MemberFixture.create(id = Random.nextLong(), name = "name1"), MemberFixture.create(id = Random.nextLong(), name = "name2"), MemberFixture.create(id = Random.nextLong(), name = "name3"), @@ -96,11 +107,7 @@ class MemberControllerTest( ) `when`("같은 이메일이 없으면") { every { - memberRepository.existsByEmail(request.email) - } returns false - - every { - memberRepository.save(any()) + memberWriter.create(any(), any(), any(), any()) } returns MemberFixture.create( id = 1, name = request.name, @@ -124,8 +131,8 @@ class MemberControllerTest( `when`("같은 이메일이 있으면") { every { - memberRepository.existsByEmail(request.email) - } returns true + memberWriter.create(request.name, request.email, request.password, Role.MEMBER) + } throws MemberException(MemberErrorCode.DUPLICATE_EMAIL) then("에러 응답") { val expectedError = MemberErrorCode.DUPLICATE_EMAIL @@ -138,7 +145,6 @@ class MemberControllerTest( status { isEqualTo(expectedError.httpStatus.value()) } jsonPath("$.code") { value(expectedError.errorCode) } } - } } } diff --git a/src/test/kotlin/roomescape/util/RoomescapeApiTest.kt b/src/test/kotlin/roomescape/util/RoomescapeApiTest.kt index 9a038941..aaa2af4c 100644 --- a/src/test/kotlin/roomescape/util/RoomescapeApiTest.kt +++ b/src/test/kotlin/roomescape/util/RoomescapeApiTest.kt @@ -11,7 +11,6 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Import import org.springframework.context.annotation.Primary import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext -import org.springframework.data.repository.findByIdOrNull import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.test.web.servlet.* @@ -22,7 +21,9 @@ import roomescape.auth.web.support.AuthInterceptor import roomescape.auth.web.support.MemberIdResolver import roomescape.common.config.JacksonConfig import roomescape.common.log.ApiLogMessageConverter -import roomescape.member.business.MemberService +import roomescape.member.exception.MemberErrorCode +import roomescape.member.exception.MemberException +import roomescape.member.implement.MemberFinder import roomescape.member.infrastructure.persistence.MemberEntity import roomescape.member.infrastructure.persistence.MemberRepository import roomescape.util.MemberFixture.NOT_LOGGED_IN_USERID @@ -37,14 +38,14 @@ abstract class RoomescapeApiTest : BehaviorSpec() { @SpykBean private lateinit var memberIdResolver: MemberIdResolver - @SpykBean - lateinit var memberService: MemberService + @MockkBean + private lateinit var memberRepository: MemberRepository @SpykBean lateinit var apiLogMessageConverter: ApiLogMessageConverter - @MockkBean - lateinit var memberRepository: MemberRepository + @SpykBean + lateinit var memberFinder: MemberFinder @MockkBean lateinit var jwtHandler: JwtHandler @@ -96,8 +97,7 @@ abstract class RoomescapeApiTest : BehaviorSpec() { jwtHandler.getMemberIdFromToken(any()) } returns admin.id!! - every { memberRepository.existsById(admin.id!!) } returns true - every { memberRepository.findByIdOrNull(admin.id!!) } returns admin + every { memberFinder.findById(admin.id!!) } returns admin } fun loginAsUser() { @@ -105,8 +105,7 @@ abstract class RoomescapeApiTest : BehaviorSpec() { jwtHandler.getMemberIdFromToken(any()) } returns user.id!! - every { memberRepository.existsById(user.id!!) } returns true - every { memberRepository.findByIdOrNull(user.id!!) } returns user + every { memberFinder.findById(user.id!!) } returns user } fun doNotLogin() { @@ -114,8 +113,9 @@ abstract class RoomescapeApiTest : BehaviorSpec() { jwtHandler.getMemberIdFromToken(any()) } throws AuthException(AuthErrorCode.INVALID_TOKEN) - every { memberRepository.existsById(NOT_LOGGED_IN_USERID) } returns false - every { memberRepository.findByIdOrNull(NOT_LOGGED_IN_USERID) } returns null + every { + memberFinder.findById(NOT_LOGGED_IN_USERID) + } throws MemberException(MemberErrorCode.MEMBER_NOT_FOUND) } fun MvcResult.readValue(valueType: Class): T = this.response.contentAsString