From 2a9484e5dddac1254364a8c02acd1d2db95402a6 Mon Sep 17 00:00:00 2001 From: pricelees Date: Mon, 4 Aug 2025 17:26:52 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=A1=B4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=97=90=20=EC=83=88=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EB=90=9C=20MemberFinder,=20MemberWriter=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberControllerTest.kt | 26 ++++++++++++------- .../roomescape/util/RoomescapeApiTest.kt | 24 ++++++++--------- 2 files changed, 28 insertions(+), 22 deletions(-) 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