Skip to content

Commit 54f63bc

Browse files
committed
chore: fix test build error
1 parent 1fb53cd commit 54f63bc

12 files changed

Lines changed: 229 additions & 163 deletions

apps/commerce-api/src/test/java/com/loopers/domain/coupon/CouponConcurrencyTest.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,11 @@ void tearDown() {
6868
@DisplayName("동일한 쿠폰으로 여러 기기에서 동시에 주문해도, 쿠폰은 단 한번만 사용되어야 한다")
6969
void shouldUseCouponOnlyOnce_whenConcurrentOrdersWithSameCoupon() throws InterruptedException {
7070
// given
71-
String memberId = "testUser";
72-
memberFacade.registerMember(memberId, memberId + "@test.com", "password", "1990-01-01", Gender.MALE);
71+
String username = "testUser";
72+
memberFacade.registerMember(username, username + "@test.com", "password", "1990-01-01", Gender.MALE);
73+
74+
// Member ID is 1L (first member created after table truncation)
75+
Long memberId = 1L;
7376

7477
Point existingPoint = pointRepository.findByMemberId(memberId).orElseThrow();
7578
existingPoint.addAmount(BigDecimal.valueOf(100000));
@@ -144,9 +147,14 @@ void shouldUseEachCouponCorrectly_whenConcurrentOrdersWithDifferentCoupons() thr
144147
Long[] couponIds = new Long[threadCount];
145148

146149
// 10명의 회원 생성 및 각각 쿠폰 발급
150+
Long[] memberIds = new Long[threadCount];
147151
for (int i = 0; i < threadCount; i++) {
148-
String memberId = "member" + i;
149-
memberFacade.registerMember(memberId, memberId + "@test.com", "password", "1990-01-01", Gender.MALE);
152+
String username = "member" + i;
153+
memberFacade.registerMember(username, username + "@test.com", "password", "1990-01-01", Gender.MALE);
154+
155+
// Member IDs are assigned sequentially starting from 1L
156+
Long memberId = (long) (i + 1);
157+
memberIds[i] = memberId;
150158

151159
Point existingPoint = pointRepository.findByMemberId(memberId).orElseThrow();
152160
existingPoint.addAmount(BigDecimal.valueOf(50000));
@@ -163,7 +171,7 @@ void shouldUseEachCouponCorrectly_whenConcurrentOrdersWithDifferentCoupons() thr
163171
// when: 10명이 각자의 쿠폰으로 동시에 주문
164172
try (ExecutorService executorService = Executors.newFixedThreadPool(threadCount)) {
165173
for (int i = 0; i < threadCount; i++) {
166-
final String memberId = "member" + i;
174+
final Long memberId = memberIds[i];
167175
final Long couponId = couponIds[i];
168176
executorService.submit(() -> {
169177
try {
@@ -200,8 +208,11 @@ void shouldUseEachCouponCorrectly_whenConcurrentOrdersWithDifferentCoupons() thr
200208
@DisplayName("동일한 유저가 여러 주문을 동시에 쿠폰과 함께 수행해도, 쿠폰별로 정상 처리되어야 한다")
201209
void shouldHandleConcurrentOrdersWithMultipleCoupons_forSameUser() throws InterruptedException {
202210
// given
203-
String memberId = "testUser";
204-
memberFacade.registerMember(memberId, memberId + "@test.com", "password", "1990-01-01", Gender.MALE);
211+
String username = "testUser";
212+
memberFacade.registerMember(username, username + "@test.com", "password", "1990-01-01", Gender.MALE);
213+
214+
// Member ID is 1L (first member created after table truncation)
215+
Long memberId = 1L;
205216

206217
Point existingPoint = pointRepository.findByMemberId(memberId).orElseThrow();
207218
existingPoint.addAmount(BigDecimal.valueOf(100000));

apps/commerce-api/src/test/java/com/loopers/domain/coupon/MemberCouponTest.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class IssueMemberCoupon {
2121
@Test
2222
void shouldIssueMemberCoupon() {
2323
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
24-
String memberId = "member123";
24+
Long memberId = 123L;
2525

2626
MemberCoupon memberCoupon = MemberCoupon.issue(memberId, coupon);
2727

@@ -30,20 +30,20 @@ void shouldIssueMemberCoupon() {
3030
assertThat(memberCoupon.isUsed()).isFalse();
3131
}
3232

33-
@DisplayName("회원 ID가 비어있으면 예외가 발생한다")
33+
@DisplayName("회원 ID가 null이면 예외가 발생한다")
3434
@Test
3535
void shouldThrowException_whenMemberIdIsEmpty() {
3636
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
3737

38-
assertThatThrownBy(() -> MemberCoupon.issue("", coupon))
38+
assertThatThrownBy(() -> MemberCoupon.issue(null, coupon))
3939
.isInstanceOf(CoreException.class)
4040
.hasMessageContaining("회원 ID는 필수입니다");
4141
}
4242

4343
@DisplayName("쿠폰이 null이면 예외가 발생한다")
4444
@Test
4545
void shouldThrowException_whenCouponIsNull() {
46-
assertThatThrownBy(() -> MemberCoupon.issue("member123", null))
46+
assertThatThrownBy(() -> MemberCoupon.issue(123L, null))
4747
.isInstanceOf(CoreException.class)
4848
.hasMessageContaining("쿠폰 정보는 필수입니다");
4949
}
@@ -57,7 +57,7 @@ class UseMemberCoupon {
5757
@Test
5858
void shouldMarkAsUsed() {
5959
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
60-
MemberCoupon memberCoupon = MemberCoupon.issue("member123", coupon);
60+
MemberCoupon memberCoupon = MemberCoupon.issue(123L, coupon);
6161

6262
memberCoupon.use();
6363

@@ -68,7 +68,7 @@ void shouldMarkAsUsed() {
6868
@Test
6969
void shouldThrowException_whenAlreadyUsed() {
7070
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
71-
MemberCoupon memberCoupon = MemberCoupon.issue("member123", coupon);
71+
MemberCoupon memberCoupon = MemberCoupon.issue(123L, coupon);
7272
memberCoupon.use();
7373

7474
assertThatThrownBy(memberCoupon::use)
@@ -85,7 +85,7 @@ class ValidateUsable {
8585
@Test
8686
void shouldPassValidation_whenUsable() {
8787
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
88-
MemberCoupon memberCoupon = MemberCoupon.issue("member123", coupon);
88+
MemberCoupon memberCoupon = MemberCoupon.issue(123L, coupon);
8989

9090
memberCoupon.validateUsable();
9191

@@ -96,7 +96,7 @@ void shouldPassValidation_whenUsable() {
9696
@Test
9797
void shouldThrowException_whenNotUsable() {
9898
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
99-
MemberCoupon memberCoupon = MemberCoupon.issue("member123", coupon);
99+
MemberCoupon memberCoupon = MemberCoupon.issue(123L, coupon);
100100
memberCoupon.use();
101101

102102
assertThatThrownBy(memberCoupon::validateUsable)
@@ -113,18 +113,18 @@ class ValidateOwnership {
113113
@Test
114114
void shouldPassValidation_whenOwner() {
115115
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
116-
MemberCoupon memberCoupon = MemberCoupon.issue("member123", coupon);
116+
MemberCoupon memberCoupon = MemberCoupon.issue(123L, coupon);
117117

118-
memberCoupon.validateOwnership("member123");
118+
memberCoupon.validateOwnership(123L);
119119
}
120120

121121
@DisplayName("소유자가 아닌 경우 예외가 발생한다")
122122
@Test
123123
void shouldThrowException_whenNotOwner() {
124124
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
125-
MemberCoupon memberCoupon = MemberCoupon.issue("member123", coupon);
125+
MemberCoupon memberCoupon = MemberCoupon.issue(123L, coupon);
126126

127-
assertThatThrownBy(() -> memberCoupon.validateOwnership("otherMember"))
127+
assertThatThrownBy(() -> memberCoupon.validateOwnership(999L))
128128
.isInstanceOf(CoreException.class)
129129
.hasMessageContaining("본인의 쿠폰만 사용할 수 있습니다");
130130
}
@@ -138,7 +138,7 @@ class CalculateDiscount {
138138
@Test
139139
void shouldDelegateToLinkedCoupon() {
140140
Coupon coupon = Coupon.createFixedCoupon("1000원 할인", BigDecimal.valueOf(1000));
141-
MemberCoupon memberCoupon = MemberCoupon.issue("member123", coupon);
141+
MemberCoupon memberCoupon = MemberCoupon.issue(123L, coupon);
142142
Money originalPrice = Money.of(10000);
143143

144144
Money discount = memberCoupon.calculateDiscount(originalPrice);

apps/commerce-api/src/test/java/com/loopers/domain/like/LikeReadServiceTest.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,33 @@
11
package com.loopers.domain.like;
22

33
import com.loopers.domain.like.service.LikeReadService;
4+
import com.loopers.infrastructure.cache.MemberLikesCache;
45
import org.junit.jupiter.api.BeforeEach;
56
import org.junit.jupiter.api.Test;
67

78
import static org.assertj.core.api.Assertions.*;
9+
import static org.mockito.Mockito.*;
810

911
class LikeReadServiceTest {
1012

1113
private InMemoryLikeRepository likeRepository;
14+
private MemberLikesCache memberLikesCache;
1215
private LikeReadService likeReadService;
1316

1417
@BeforeEach
1518
void setUp() {
1619
likeRepository = new InMemoryLikeRepository();
17-
likeReadService = new LikeReadService(likeRepository);
20+
memberLikesCache = mock(MemberLikesCache.class);
21+
likeReadService = new LikeReadService(likeRepository, memberLikesCache);
1822
}
1923

2024
@Test
2125
void should_count_likes_by_product_id() {
2226
// given
2327
Long productId = 1L;
24-
likeRepository.save(new Like("member1", productId));
25-
likeRepository.save(new Like("member2", productId));
26-
likeRepository.save(new Like("member3", 2L)); // 다른 상품
28+
likeRepository.save(new Like(1L, productId));
29+
likeRepository.save(new Like(2L, productId));
30+
likeRepository.save(new Like(3L, 2L)); // 다른 상품
2731

2832
// when
2933
long count = likeReadService.countByProductId(productId);
@@ -47,7 +51,7 @@ void should_return_zero_when_no_likes_for_product() {
4751
@Test
4852
void should_check_if_member_liked_product() {
4953
// given
50-
String memberId = "member1";
54+
Long memberId = 1L;
5155
Long productId = 1L;
5256
likeRepository.save(new Like(memberId, productId));
5357

@@ -61,7 +65,7 @@ void should_check_if_member_liked_product() {
6165
@Test
6266
void should_return_false_when_member_did_not_like_product() {
6367
// given
64-
String memberId = "member1";
68+
Long memberId = 1L;
6569
Long productId = 1L;
6670

6771
// when
@@ -74,9 +78,9 @@ void should_return_false_when_member_did_not_like_product() {
7478
@Test
7579
void should_return_false_when_member_id_is_null() {
7680
// given
77-
String memberId = null;
81+
Long memberId = null;
7882
Long productId = 1L;
79-
likeRepository.save(new Like("member1", productId));
83+
likeRepository.save(new Like(1L, productId));
8084

8185
// when
8286
boolean isLiked = likeReadService.isLikedBy(memberId, productId);
@@ -88,10 +92,10 @@ void should_return_false_when_member_id_is_null() {
8892
@Test
8993
void should_not_check_other_members_likes() {
9094
// given
91-
String memberId1 = "member1";
92-
String memberId2 = "member2";
95+
Long memberId1 = 1L;
96+
Long memberId2 = 2L;
9397
Long productId = 1L;
94-
98+
9599
likeRepository.save(new Like(memberId1, productId));
96100

97101
// when

apps/commerce-api/src/test/java/com/loopers/domain/order/InMemoryOrderRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ public Optional<Order> findById(Long id) {
1717
return Optional.ofNullable(store.get(id));
1818
}
1919

20+
@Override
21+
public Optional<Order> findByOrderNo(String orderNo) {
22+
return store.values().stream()
23+
.filter(order -> orderNo.equals(order.getOrderNo()))
24+
.findFirst();
25+
}
26+
2027
@Override
2128
public Order save(Order order) {
2229
if (order.getId() == null) {

apps/commerce-api/src/test/java/com/loopers/domain/order/OrderConcurrencyTest.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,15 @@ void shouldDeductStockCorrectly_whenConcurrentOrders() throws InterruptedExcepti
7676
int threadCount = 10;
7777

7878
// 10명의 회원 생성 및 포인트 부여
79+
Long[] memberIds = new Long[threadCount];
7980
for (int i = 0; i < threadCount; i++) {
80-
String memberId = "member" + i;
81-
memberFacade.registerMember(memberId, memberId + "@test.com", "password", "1990-01-01", Gender.MALE);
81+
String username = "member" + i;
82+
memberFacade.registerMember(username, username + "@test.com", "password", "1990-01-01", Gender.MALE);
8283
// MemberFacade가 이미 Point를 0원으로 생성했으므로 업데이트
84+
// Member IDs are assigned sequentially starting from 1L
85+
Long memberId = (long) (i + 1);
86+
memberIds[i] = memberId;
87+
8388
Point existingPoint = pointRepository.findByMemberId(memberId).orElseThrow();
8489
existingPoint.addAmount(BigDecimal.valueOf(10000));
8590
pointRepository.save(existingPoint);
@@ -92,7 +97,7 @@ void shouldDeductStockCorrectly_whenConcurrentOrders() throws InterruptedExcepti
9297
// when: 10명이 동시에 1개씩 주문
9398
try (ExecutorService executorService = Executors.newFixedThreadPool(threadCount)) {
9499
for (int i = 0; i < threadCount; i++) {
95-
final String memberId = "member" + i;
100+
final Long memberId = memberIds[i];
96101
executorService.submit(() -> {
97102
try {
98103
OrderCommand command = OrderCommand.of(
@@ -139,10 +144,14 @@ void shouldRejectOrders_whenStockInsufficient() throws InterruptedException {
139144
int threadCount = 10;
140145

141146
// 10명의 회원 생성 및 포인트 부여
147+
Long[] memberIds2 = new Long[threadCount];
142148
for (int i = 0; i < threadCount; i++) {
143-
String memberId = "member" + i;
144-
memberFacade.registerMember(memberId, memberId + "@test.com", "password", "1990-01-01", Gender.MALE);
145-
// MemberFacade가 이미 Point를 0원으로 생성했으므로 업데이트
149+
String username = "member" + i;
150+
memberFacade.registerMember(username, username + "@test.com", "password", "1990-01-01", Gender.MALE);
151+
// Member IDs are assigned sequentially starting from 1L
152+
Long memberId = (long) (i + 1);
153+
memberIds2[i] = memberId;
154+
146155
Point existingPoint = pointRepository.findByMemberId(memberId).orElseThrow();
147156
existingPoint.addAmount(BigDecimal.valueOf(10000));
148157
pointRepository.save(existingPoint);
@@ -155,7 +164,7 @@ void shouldRejectOrders_whenStockInsufficient() throws InterruptedException {
155164
// when: 10명이 동시에 1개씩 주문 (재고는 5개)
156165
try (ExecutorService executorService = Executors.newFixedThreadPool(threadCount)) {
157166
for (int i = 0; i < threadCount; i++) {
158-
final String memberId = "member" + i;
167+
final Long memberId = memberIds2[i];
159168
executorService.submit(() -> {
160169
try {
161170
OrderCommand command = OrderCommand.of(
@@ -209,9 +218,14 @@ void shouldDeductMultipleProductStocksCorrectly_whenConcurrentOrdersWithMultiple
209218
int threadCount = 5;
210219

211220
// 5명의 회원 생성 및 포인트 부여
221+
Long[] memberIds3 = new Long[threadCount];
212222
for (int i = 0; i < threadCount; i++) {
213-
String memberId = "member" + i;
214-
memberFacade.registerMember(memberId, memberId + "@test.com", "password", "1990-01-01", Gender.MALE);
223+
String username = "member" + i;
224+
memberFacade.registerMember(username, username + "@test.com", "password", "1990-01-01", Gender.MALE);
225+
// Member IDs are assigned sequentially starting from 1L
226+
Long memberId = (long) (i + 1);
227+
memberIds3[i] = memberId;
228+
215229
Point existingPoint = pointRepository.findByMemberId(memberId).orElseThrow();
216230
existingPoint.addAmount(BigDecimal.valueOf(50000));
217231
pointRepository.save(existingPoint);
@@ -222,7 +236,7 @@ void shouldDeductMultipleProductStocksCorrectly_whenConcurrentOrdersWithMultiple
222236
// when: 5명이 동시에 각 상품 2개씩 주문
223237
try (ExecutorService executorService = Executors.newFixedThreadPool(threadCount)) {
224238
for (int i = 0; i < threadCount; i++) {
225-
final String memberId = "member" + i;
239+
final Long memberId = memberIds3[i];
226240
executorService.submit(() -> {
227241
try {
228242
OrderCommand command = OrderCommand.of(

0 commit comments

Comments
 (0)