From abb57027f541812e586932d272b856eaf40e42a9 Mon Sep 17 00:00:00 2001 From: pie Date: Sun, 31 Dec 2023 22:16:46 +0900 Subject: [PATCH] =?UTF-8?q?test=20#82=20:=20=EB=8F=99=EC=8B=9C=EC=84=B1=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ItemConcurrencyTest.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/test/java/pie/tomato/tomatomarket/application/ItemConcurrencyTest.java diff --git a/src/test/java/pie/tomato/tomatomarket/application/ItemConcurrencyTest.java b/src/test/java/pie/tomato/tomatomarket/application/ItemConcurrencyTest.java new file mode 100644 index 000000000..7cc0d0c6c --- /dev/null +++ b/src/test/java/pie/tomato/tomatomarket/application/ItemConcurrencyTest.java @@ -0,0 +1,89 @@ +package pie.tomato.tomatomarket.application; + +import static org.assertj.core.api.Assertions.*; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import pie.tomato.tomatomarket.application.item.ItemService; +import pie.tomato.tomatomarket.domain.Category; +import pie.tomato.tomatomarket.domain.Item; +import pie.tomato.tomatomarket.domain.ItemStatus; +import pie.tomato.tomatomarket.domain.Member; +import pie.tomato.tomatomarket.presentation.support.Principal; +import pie.tomato.tomatomarket.support.SupportRepository; + +@SpringBootTest +public class ItemConcurrencyTest { + + @Autowired + private ItemService itemService; + + @Autowired + private SupportRepository supportRepository; + + @DisplayName("상품의 상세 페이지를 여러명이 동시에 조회한다.") + @Test + void itemDetails_concurrency() throws InterruptedException { + // given + List members = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + Member member = supportRepository.save(new Member("파이" + i, "123@123" + i, "profile")); + members.add(member); + } + Category category = setupCategory(); + + Item item1 = setItem(members.get(0), category, "1번", "내용1", ItemStatus.ON_SALE); + + int threadCount = 8; + ExecutorService executorService = Executors.newFixedThreadPool(threadCount); + CountDownLatch countDownLatch = new CountDownLatch(100); + + // when + for (int i = 0; i < 100; i++) { + Member member = members.get(i); + executorService.execute(() -> { + try { + itemService.itemDetails(setPrincipal(member), item1.getId()); + } finally { + countDownLatch.countDown(); + } + }); + } + + countDownLatch.await(); + + // then + Thread.sleep(1000 * 90); + + Item findItem = supportRepository.findById(item1.getId(), Item.class); + assertThat(findItem.getViewCount()).isEqualTo(100); + } + + private Principal setPrincipal(Member member) { + Principal principal = Principal.builder() + .nickname(member.getNickname()) + .email(member.getEmail()) + .memberId(member.getId()) + .build(); + return principal; + } + + private Category setupCategory() { + return supportRepository.save(new Category("잡화", "categoryImage")); + } + + private Item setItem(Member member, Category category, String title, String content, ItemStatus status) { + return supportRepository.save(new Item(title, content, 3000L, "thumbnail", status, + "역삼1동", 0L, 0L, 0L, LocalDateTime.now(), member, category)); + } +}