만들어둔 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
'Study > 실전! 스프링 부트와 JPA 활용1' 카테고리의 다른 글
회원 관리 기능 개발 (0) | 2022.07.20 |
---|---|
주문 개발 5 (주문 검색 기능 개발 - OrderRepository) (0) | 2022.07.19 |
주문 개발 3 (OrderService- 주문 개발) (0) | 2022.07.15 |
주문 개발 2 (Order- 주문 개발) (0) | 2022.07.14 |
주문 개발 1 (Item - 상품 개발) (0) | 2022.07.14 |
댓글