본문 바로가기
Study/실전! 스프링 부트와 JPA 활용1

주문 개발 4 (OrderService Test)

by Subi 2022. 7. 15.

만들어둔 OrderService에 대해 Test 코드를 추가해 테스트를 진행했다.

 

먼저 OrderServiceTest 클래스를 추가해 준 다음,

 

@Autowired
EntityManager em;
@Autowired
OrderService orderService;

@Autowired
OrderRepository orderRepository;

OrderService와 OrderRepository 그리고 EntityManager의 인젝션을 추가해준다.

그리고 공통으로 쓰는 회원생성과 상품생성에 대한 부분은 private로 메서드를 생성시켜준다.

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

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;
}

먼저 상품주문에 대한 테스트를 진행한다.

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

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

    int orderCount = 2;

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

    //then
    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());
    
}

주문을 하기 위해 주문을 하는 회원(Member) 를 받아주고,

주문을 하는 상품(Book)를 받아 주문 수량을 정해 orderService 에 Order 메서드로 넣어준다.

그렇게 진행된 order를 확인하기 위해

주문 상태,주문 수량, 주문 가격, 주문 후 상품의 재고 를 테스트코드로 확인해 준다.

 

두번째는 주문이 발생했을 때에 대한 상품주문 재고수량에 대한 테스트이다.

@Test(expected = NotEnoughStockException.class)
public void 상품주문_재고수량초과() throws Exception {
    //given

    Member member = createMember();
    Item item = createBook("시골 JPA",10000, 10);

    int orderCount = 11;

    //when
    orderService.order(member.getId(),item.getId(), orderCount);

    //then
    fail("재고 수량 부족 예외가 발생해야 한다.");

}

테스트는 주문 수량이 초과하여 NotEnoughStockException 이 발생했을 경우 테스트코드가 성공했다고 인식 할 수 있도록, @Test(expected = NotEnoughStockException.class) 를 어노테이션으로 설정 하여 준다.

 

회원과 상품을 설정한 뒤 주문 수량을 재고 수량보다 많게 설정을 하고 주문 테스트를 진행을 하니

테스트가 성공을 하였다.

그 다음 orderCount 의 값을 10 으로 바꾸고 테스트를 진행을 하니

라는 에러가 출력이 되면서 테스트가 실패하였다.

주문이 정상적으로 이루어 졌다는 결과이다.

 

마지막으로 주문취소에 대한 테스트 코드를 작성하였다.

@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("주문 취소시 상태는 CANCLE 이다.",OrderStatus.CANCEL,getOrder.getStatus());
    assertEquals("주문이 취소된 상품은 그만큼 재고가 증가해야 된다.",10, item.getStockQuantity());

}

주문을 취소했을 시 주문에 대한 데이터의 상태값이 CANCLE 이 되어야 하고, 상품에 재고는 취소된 주문 수량 만큼 늘어나야 한다.

테스트 결과 올바르게 작동이 잘 되었다.

 

강의 : 인프런 실전! 스프링 부트와 JPA 활용1 (김영한)  https://inf.run/VMWU

댓글