주문 기능 테스트

테스트할 내용

  1. 주문 생성

  2. 주문 생성 시에 핵심 validation 확인 : 재고 수량 초과할 때

  3. 주문 취소

주문 생성 테스트

  1. Member, Item 엔티티 생성

  2. OrderService.order(member,item,orderCount) : 주문 생성

  3. 검증 : ① 주문상태는 ORDER여야 한다. ② 주문 상품 갯수 : 주문한 상품 수가 정확해야 한다. ③ 계산 로직 검증 : 주문 가격은 가격 X 수량이다. ④ 주문 수량만큼 재고 수량 감소 : 주문 수량만큼 재고가 줄어야 한다.

@Test
public void 상품주문() throws Exception{
  //given
  Member member = createMembr();
  Item book = createBook("시골 JPA", 10000, 10);

  //when : 주문서비스로 주문 생성
  int orderCount = 2;
  Long orderId = orderService.order(member.getId(), book.getId(), orderCount);

  //then : 검증=>orderRepository에 주문이 잘 들어가 있는지 확인!
  Order getOrder = orderRepository.findOne(orderId);
  assertEquals("상품 주문시 상태는 ORDER", OrderStatus.ORDER,getOrder.getStatus());
  assertEquals("주문한 상품 종류 수가 정확해야 한다", 1,getOrder.getOrderItems().size());
  assertEquals("주문 가격은 가격 * 수량이다.",10000*orderCount,getOrder.getTotalPrice());
  assertEquals("주문 수량만큼 재고가 줄어야 한다.",8,book.getStockQuantity());
}

주문 생성 시 재고 수량 초과 테스트

  1. Member, Item 엔티티 생성

  2. OrderService.order(member,item,orderCount) : 주문 생성, 주문 수량>재고 수량

  3. 구현해둔 NotEnoughStockException이 발생해야하고, 코드가 더 흘러가면 테스트 코드를 잘못 작성한 것이므로 Assert.fail()로 오류 메시지 출력한다.

OrderService.order()로 주문 생성 OrderItem 생성>removeStock()으로 수량 감소 Item 클래스에서 구현된 removeStock() 익셉션!

OrderService.order() => OrderItem.createOrderItem() => Item.removeStock

/**
 * stock 감소
 */
public void removeStock(int quantity){
    int restStock = this.stockQuantity - quantity;
    if(restStock < 0){
        throw new NotEnoughStockException("need more stock");
    }
    this.stockQuantity = restStock;
}

DB나 스프링과 관계없이 단위테스트를 하는 것이 좋다! 물론 통합테스트도 필요하지만 말이다! 그래서 상품주문 재고 수량초과 테스트 시에 통합 테스트가 아닌, 핵심 validation 부분인 removeStock() 자체에 대한 단위테스트가 중요하다!

주문 취소 테스트 : OrderService.cancleOrder(orderId)

  1. 주문 상태 CANCEL인지 검증

  2. 상품 수량 다시 증가했는지 검증

@Test
    public void 주문취소() throws Exception{
        //given
        Member member = createMembr();
        Book item = createBook("시골 JPA",10000,10);

        int orderCount = 2;
        Long orderId = orderService.order(member.getId(), item.getId(), orderCount);
        //when : 실제 테스트하고 싶은 상황
        orderService.cancleOrder(orderId);
        //then
        //1. 주문 상태 CANCEL인지 확인
        //2. 재고 정상 복구 확인
        Order getOrder = orderRepository.findOne(orderId);
        assertEquals("주문 취소 시 상태는 CANCEL이다.",OrderStatus.CANCEL,getOrder.getStatus());
        assertEquals("주문 취소된 상품은 그만큼 재고가 증가해야 한다.",10,item.getStockQuantity());//캔슬하기 때문에 수량 다시 10개 되야함.
    }

  • 도메인 모델 패턴 장점

    Order 엔티티에 대해 테스트 가능. Order에서 핵심 비즈니스 로직들이 구현되기 때문.

Last updated