test: PaymentServiceTest에 결제 수단별 테스트 추가

This commit is contained in:
이상진 2025-10-16 15:29:34 +09:00
parent 9fe576af11
commit 385f98fb21

View File

@ -2,10 +2,11 @@ package com.sangdol.roomescape.payment
import com.ninjasquad.springmockk.MockkBean
import com.sangdol.roomescape.payment.business.PaymentService
import com.sangdol.roomescape.payment.business.domain.PaymentMethod
import com.sangdol.roomescape.payment.business.domain.UserFacingPaymentErrorCode
import com.sangdol.roomescape.payment.business.domain.*
import com.sangdol.roomescape.payment.business.event.PaymentEvent
import com.sangdol.roomescape.payment.business.event.PaymentEventListener
import com.sangdol.roomescape.payment.dto.PaymentConfirmRequest
import com.sangdol.roomescape.payment.dto.PaymentGatewayResponse
import com.sangdol.roomescape.payment.exception.ExternalPaymentException
import com.sangdol.roomescape.payment.exception.PaymentErrorCode
import com.sangdol.roomescape.payment.exception.PaymentException
@ -31,31 +32,67 @@ class PaymentServiceTest(
context("결제를 승인한다.") {
val request = PaymentFixture.confirmRequest
test("결제 정상 승인 및 이벤트 발행 확인") {
context("결제 정상 승인 및 이벤트 발행 확인") {
test("간편결제 + 카드") {
val tosspayAPIResponse = PaymentFixture.confirmResponse(
paymentKey = request.paymentKey,
amount = request.amount,
orderId = request.orderId,
method = PaymentMethod.CARD
method = PaymentMethod.EASY_PAY,
cardDetail = PaymentFixture.cardDetail(100_000),
easyPayDetail = PaymentFixture.easypayDetail(0)
)
val paymentEventSlot = slot<PaymentEvent>()
runSuccessTest(request, tosspayAPIResponse) {
assertSoftly(it.detail) {
this::class shouldBe EasypayCardPaymentDetail::class
}
}
}
every {
tosspayClient.confirm(request.paymentKey, request.orderId, request.amount)
} returns tosspayAPIResponse
test("간편결제 - 충전식") {
val tosspayAPIResponse = PaymentFixture.confirmResponse(
paymentKey = request.paymentKey,
amount = request.amount,
orderId = request.orderId,
method = PaymentMethod.EASY_PAY,
)
every {
paymentEventListener.handlePaymentEvent(capture(paymentEventSlot))
} just runs
runSuccessTest(request, tosspayAPIResponse) {
assertSoftly(it.detail) {
this::class shouldBe EasypayPrepaidPaymentDetail::class
}
}
}
paymentService.requestConfirm(12345L, request)
test("카드") {
val tosspayAPIResponse = PaymentFixture.confirmResponse(
paymentKey = request.paymentKey,
amount = request.amount,
orderId = request.orderId,
method = PaymentMethod.CARD,
)
assertSoftly(paymentEventSlot.captured) {
this.paymentKey shouldBe request.paymentKey
this.orderId shouldBe request.orderId
this.totalAmount shouldBe request.amount
this.method shouldBe PaymentMethod.CARD
runSuccessTest(request, tosspayAPIResponse) {
assertSoftly(it.detail) {
this::class shouldBe CardPaymentDetail::class
}
}
}
test("계좌이체") {
val tosspayAPIResponse = PaymentFixture.confirmResponse(
paymentKey = request.paymentKey,
amount = request.amount,
orderId = request.orderId,
method = PaymentMethod.TRANSFER,
)
runSuccessTest(request, tosspayAPIResponse) {
assertSoftly(it.detail) {
this::class shouldBe BankTransferPaymentDetail::class
}
}
}
}
@ -122,4 +159,27 @@ class PaymentServiceTest(
}
}
}
private fun runSuccessTest(request: PaymentConfirmRequest, tosspayAPIResponse: PaymentGatewayResponse, additionalAssertion: (PaymentEvent) -> Unit): PaymentEvent {
val paymentEventSlot = slot<PaymentEvent>()
every {
tosspayClient.confirm(request.paymentKey, request.orderId, request.amount)
} returns tosspayAPIResponse
every {
paymentEventListener.handlePaymentEvent(capture(paymentEventSlot))
} just runs
paymentService.requestConfirm(12345L, request)
assertSoftly(paymentEventSlot.captured) {
this.paymentKey shouldBe request.paymentKey
this.orderId shouldBe request.orderId
this.totalAmount shouldBe request.amount
this.method shouldBe tosspayAPIResponse.method
}
return paymentEventSlot.captured
}
}