[#30] 코드 구조 개선 #31

Merged
pricelees merged 31 commits from refactor/#30 into main 2025-08-06 10:16:08 +00:00
2 changed files with 28 additions and 22 deletions
Showing only changes of commit 2a9484e5dd - Show all commits

View File

@ -1,15 +1,19 @@
package roomescape.member.controller package roomescape.member.controller
import com.ninjasquad.springmockk.MockkBean
import com.ninjasquad.springmockk.SpykBean
import io.kotest.assertions.assertSoftly import io.kotest.assertions.assertSoftly
import io.kotest.matchers.collections.shouldContainAll import io.kotest.matchers.collections.shouldContainAll
import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldBe
import io.mockk.every import io.mockk.every
import io.mockk.mockk
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.MockMvc
import roomescape.auth.exception.AuthErrorCode import roomescape.auth.exception.AuthErrorCode
import roomescape.member.business.MemberService
import roomescape.member.exception.MemberErrorCode import roomescape.member.exception.MemberErrorCode
import roomescape.member.exception.MemberException
import roomescape.member.implement.MemberWriter
import roomescape.member.infrastructure.persistence.Role import roomescape.member.infrastructure.persistence.Role
import roomescape.member.web.MemberController import roomescape.member.web.MemberController
import roomescape.member.web.MemberRetrieveListResponse import roomescape.member.web.MemberRetrieveListResponse
@ -23,11 +27,18 @@ class MemberControllerTest(
@Autowired private val mockMvc: MockMvc @Autowired private val mockMvc: MockMvc
) : RoomescapeApiTest() { ) : RoomescapeApiTest() {
@SpykBean
private lateinit var memberService: MemberService
@MockkBean
private lateinit var memberWriter: MemberWriter
init { init {
given("GET /members 요청을") { given("GET /members 요청을") {
val endpoint = "/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 = "name1"),
MemberFixture.create(id = Random.nextLong(), name = "name2"), MemberFixture.create(id = Random.nextLong(), name = "name2"),
MemberFixture.create(id = Random.nextLong(), name = "name3"), MemberFixture.create(id = Random.nextLong(), name = "name3"),
@ -96,11 +107,7 @@ class MemberControllerTest(
) )
`when`("같은 이메일이 없으면") { `when`("같은 이메일이 없으면") {
every { every {
memberRepository.existsByEmail(request.email) memberWriter.create(any(), any(), any(), any())
} returns false
every {
memberRepository.save(any())
} returns MemberFixture.create( } returns MemberFixture.create(
id = 1, id = 1,
name = request.name, name = request.name,
@ -124,8 +131,8 @@ class MemberControllerTest(
`when`("같은 이메일이 있으면") { `when`("같은 이메일이 있으면") {
every { every {
memberRepository.existsByEmail(request.email) memberWriter.create(request.name, request.email, request.password, Role.MEMBER)
} returns true } throws MemberException(MemberErrorCode.DUPLICATE_EMAIL)
then("에러 응답") { then("에러 응답") {
val expectedError = MemberErrorCode.DUPLICATE_EMAIL val expectedError = MemberErrorCode.DUPLICATE_EMAIL
@ -138,7 +145,6 @@ class MemberControllerTest(
status { isEqualTo(expectedError.httpStatus.value()) } status { isEqualTo(expectedError.httpStatus.value()) }
jsonPath("$.code") { value(expectedError.errorCode) } jsonPath("$.code") { value(expectedError.errorCode) }
} }
} }
} }
} }

View File

@ -11,7 +11,6 @@ import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Import import org.springframework.context.annotation.Import
import org.springframework.context.annotation.Primary import org.springframework.context.annotation.Primary
import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpHeaders import org.springframework.http.HttpHeaders
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.test.web.servlet.* import org.springframework.test.web.servlet.*
@ -22,7 +21,9 @@ import roomescape.auth.web.support.AuthInterceptor
import roomescape.auth.web.support.MemberIdResolver import roomescape.auth.web.support.MemberIdResolver
import roomescape.common.config.JacksonConfig import roomescape.common.config.JacksonConfig
import roomescape.common.log.ApiLogMessageConverter 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.MemberEntity
import roomescape.member.infrastructure.persistence.MemberRepository import roomescape.member.infrastructure.persistence.MemberRepository
import roomescape.util.MemberFixture.NOT_LOGGED_IN_USERID import roomescape.util.MemberFixture.NOT_LOGGED_IN_USERID
@ -37,14 +38,14 @@ abstract class RoomescapeApiTest : BehaviorSpec() {
@SpykBean @SpykBean
private lateinit var memberIdResolver: MemberIdResolver private lateinit var memberIdResolver: MemberIdResolver
@SpykBean @MockkBean
lateinit var memberService: MemberService private lateinit var memberRepository: MemberRepository
@SpykBean @SpykBean
lateinit var apiLogMessageConverter: ApiLogMessageConverter lateinit var apiLogMessageConverter: ApiLogMessageConverter
@MockkBean @SpykBean
lateinit var memberRepository: MemberRepository lateinit var memberFinder: MemberFinder
@MockkBean @MockkBean
lateinit var jwtHandler: JwtHandler lateinit var jwtHandler: JwtHandler
@ -96,8 +97,7 @@ abstract class RoomescapeApiTest : BehaviorSpec() {
jwtHandler.getMemberIdFromToken(any()) jwtHandler.getMemberIdFromToken(any())
} returns admin.id!! } returns admin.id!!
every { memberRepository.existsById(admin.id!!) } returns true every { memberFinder.findById(admin.id!!) } returns admin
every { memberRepository.findByIdOrNull(admin.id!!) } returns admin
} }
fun loginAsUser() { fun loginAsUser() {
@ -105,8 +105,7 @@ abstract class RoomescapeApiTest : BehaviorSpec() {
jwtHandler.getMemberIdFromToken(any()) jwtHandler.getMemberIdFromToken(any())
} returns user.id!! } returns user.id!!
every { memberRepository.existsById(user.id!!) } returns true every { memberFinder.findById(user.id!!) } returns user
every { memberRepository.findByIdOrNull(user.id!!) } returns user
} }
fun doNotLogin() { fun doNotLogin() {
@ -114,8 +113,9 @@ abstract class RoomescapeApiTest : BehaviorSpec() {
jwtHandler.getMemberIdFromToken(any()) jwtHandler.getMemberIdFromToken(any())
} throws AuthException(AuthErrorCode.INVALID_TOKEN) } throws AuthException(AuthErrorCode.INVALID_TOKEN)
every { memberRepository.existsById(NOT_LOGGED_IN_USERID) } returns false every {
every { memberRepository.findByIdOrNull(NOT_LOGGED_IN_USERID) } returns null memberFinder.findById(NOT_LOGGED_IN_USERID)
} throws MemberException(MemberErrorCode.MEMBER_NOT_FOUND)
} }
fun <T> MvcResult.readValue(valueType: Class<T>): T = this.response.contentAsString fun <T> MvcResult.readValue(valueType: Class<T>): T = this.response.contentAsString