실전! 스프링 부트와 JPA 활용1(웹 애플리케이션 개발)

Ch06. 상품 도메인 개발 - 주문 기능 테스트

webmaster 2021. 12. 6. 22:22
728x90
@SpringBootTest
@Transactional
class OrderServiceTest {

    @Autowired
    EntityManager em;

    @Autowired
    OrderService orderService;

    @Autowired
    OrderRepository orderRepository;
    @Test
    public void 상품주문() throws Exception{
        //given
        Member member = createMember();

        Book book = createBook("시골 JPA",10000,10);

        //when
        int orderCount = 2;
        Long orderId = orderService.order(member.getId(),book.getId(),orderCount);

        //then
        Order getOrder = orderRepository.findOne(orderId);

        assertEquals( OrderStatus.ORDER,getOrder.getStatus(),"상품 주문시 상태는 ORDER");
        assertEquals( 1,getOrder.getOrderItems().size(), "주문한 상품 종류 수가 정확해야 한다.");
        assertEquals(10000 * orderCount , getOrder.getTotalPrice() , "주문 가격은 가격 * 수량이다.");
        assertEquals(8,book.getStockQuantity(),"주문 수량만큼 재고가 줄어야 한다.");
        
    }


    @Test
    public void 상품주문_재고수량초과() throws Exception{
        //given
        Member member = createMember();
        Item item = createBook("시골 JPA",10000,10);
        int orderCount = 11;
        //when
        //then
        assertThrows(NotEnoughStockException.class,() -> orderService.order(member.getId(),item.getId(),orderCount));

        //fail("재고 수량 부족 예외가 발생해야 한다.");
    }
    
    @Test
    public void 주문취소() throws Exception{
        //given
        Member member = createMember();
        Book item = createBook("시골 JPA",10000,10);

        int orderCount = 2;
        Long orderId = orderService.order(member.getId(),item.getId(),orderCount);
        //when
        orderService.cancelOrder(orderId);

        //then
        Order getOrder = orderRepository.findOne(orderId);

        assertEquals(OrderStatus.CANCEL,getOrder.getStatus(),"주문 취소시 상태는 CANCEL 이다");
        assertEquals(10,item.getStockQuantity(),"주문이 취소된 상품은 그만큼 재고가 증가해야 한다");

    }

    private Book createBook(String name,int price, int stockQuantity) {
        Book book = new Book();
        book.setName(name);
        book.setPrice(price);
        book.setStockQuantity(stockQuantity);
        em.persist(book);
        return book;
    }

    private Member createMember() {
        Member member = new Member();
        member.setName("회원1");
        member.setAddress(new Address("서울","강가","123-123"));
        em.persist(member);
        return member;
    }

}
  • 상품 주문 메서드
    • Member 생성 -> createMember()
      • createMember 함수 : Member를 생성해준다.
      • Name = 회원 1, Address는 서울, 강가, 123-123으로 생성하여 준다.
    • Book 생성 -> createBook(name,price,stockQuantity)
      • createBook 함수 : Book Item을 생성해 준다.
      • name, price, stockQuantity를 매개변수로 받아 Book을 생성해 준다.
    • 주문 횟수를 정한 뒤 OrderService.order 메서드 호출
    • 확인
      1. ORDER 상태 값으로 잘 들어갔는지?
      2. 주문한 상품 종류가 잘 맞는지?
      3. 주문한 총금액이 잘 맞는지? -> 가격 * 수량
      4. 주문 수량만큼 재고가 줄었는지?
  • 상품 주문_재고 수량 초과 메서드
    • Member 생성 -> createMember()
    • Book 생성 -> createBook(name, price, stockQuantity)
    • 주문 수량을 초과하게끔 설정한 뒤 에러 발생하는지 확인
    • assertThrows(NotEnoughStockException.class, () -> orderService.order(member.getId(), item.getId(), orderCount));
  • 주문 취소 메서드
    • Member 생성 -> createMember()
    • Book 생성 -> createBook(name, price, stockQuantity)
    • 주문 횟수를 설정한 뒤 주문 후, 다시 주문 취소 메서드 실행
    • 확인 
      • 주문 취소가 잘 되었는지(status가 CANCEL 상태야 된다)
      • 재고가 취소한 만큼 늘어났는지?
728x90