주문 기능 테스트

PPakSSam·2022년 2월 11일
0
post-thumbnail

강의에서의 테스트 코드



위의 코드를 보면 첫번째로는 상품주문 메소드와 주문 취소 메소드 모두 빨간색 박스 부분이 중복됨을 알 수 있습니다.
두번째로는 파란색 박스 부분을 언뜻 보면 8이라는 숫자가 무엇을 의미하는지 헷갈릴 수도 있습니다.

그래서 이를 해결하기 위해 다음과 같이 리팩토링을 하였습니다.

리팩토링한 테스트 코드

@SpringBootTest
@Transactional
public class OrderServiceTestJUnit5 {
   @Autowired OrderService orderService;
   @Autowired EntityManager em;

   Member member;
   Item book;

   @BeforeEach
   void setUp() {
       // 회원 등록
       Member member = new Member();
       member.setName("회원");
       member.setAddress(new Address("서울","경기","123-123"));
       em.persist(member);
       this.member = member;

       // 상품(책) 등록
       Book book = new Book();
       book.setName("JPA");
       book.setStockQuantity(BOOK_STOCK_QUANTITY);
       book.setPrice(BOOK_PRICE);
       em.persist(book);
       this.book = book;
   }
}   

빨간색 부분의 중복된 부분을 없애기 위해서 @BeforeEach에서 중복되는 부분을 분리했습니다.

@Test
void 상품_주문() throws Exception {
   // when
   int orderCount = 2;
   Long orderId = orderService.order(member.getId(), book.getId(), orderCount);

   // then
   Order findOrder = orderService.findOne(orderId);

   assertThat(findOrder.getStatus()).isEqualTo(OrderStatus.ORDER);
   assertThat(findOrder.getOrderItems()).hasSize(1);
   assertThat(book.getStockQuantity()).isEqualTo(BOOK_STOCK_QUANTITY - orderCount);
   assertThat(findOrder.getPriceTotal()).isEqualTo(BOOK_PRICE * orderCount);
}

@Test
void 주문_취소() {
   // given
   int orderCount = 3;
   Long orderId = orderService.order(member.getId(), book.getId(), orderCount);

   // when
   orderService.cancel(orderId);

   // then
   Order findOrder = orderService.findOne(orderId);

   assertThat(findOrder.getStatus()).isEqualTo(OrderStatus.CANCEL);
   assertThat(book.getStockQuantity()).isEqualTo(BOOK_STOCK_QUANTITY);
}

그 결과 이렇게 빨간색의 중복된 부분이 사라진 것을 발견하실 수 있습니다.

@SpringBootTest
@Transactional
public class OrderServiceTestJUnit5 {
   static final int BOOK_STOCK_QUANTITY = 10;
   static final int BOOK_PRICE = 10000;
   
   @Test
   void 상품_주문() throws Exception {
       // when
       int orderCount = 2;
       Long orderId = orderService.order(member.getId(), book.getId(), orderCount);

       // then
       Order findOrder = orderService.findOne(orderId);

       assertThat(findOrder.getStatus()).isEqualTo(OrderStatus.ORDER);
       assertThat(findOrder.getOrderItems()).hasSize(1);

       // (1)
       assertThat(book.getStockQuantity()).isEqualTo(BOOK_STOCK_QUANTITY - orderCount);
       assertThat(findOrder.getPriceTotal()).isEqualTo(BOOK_PRICE * orderCount);
   }
}

그리고 파란색 박스 부분은 상수를 사용함으로써 해결하였습니다.
파란색 박스 부분에서 그냥 8이라고 써져있을 때는 이 8의 의미가 뭔지 헷갈릴 수 있었는데 (1) 코드에서 처럼 BOOK_STOCK_QUANTITY - orderCount라고 명시적으로 써줌으로써 아~ 책의 현재재고가 원래 재고에서 주문수량만큼 빠졌는지 확인하는 거구나 라고 한층 이해하기 쉽게 도와주게 됩니다.

profile
성장에 대한 경험을 공유하고픈 자발적 경험주의자

0개의 댓글