-
주문 기능 테스트JPA/JPA 활용 2023. 7. 11. 18:11
주문 기능을 테스트할 때 여러 테스트에서 공통으로 사용될 Item, Member 엔티티 생성을 공통으로 묶어서 private으로 선언했다.
private Item createBook(String name, int price, int stockQuantity) { Item book = new Book(); book.setName(name); book.setPrice(price); book.setStockQuantity(stockQuantity); em.persist(book); return book; } private Member creatMember() { Member member = new Member(); member.setName("회원1"); member.setAddress(new Address("서울", "강가", "123-123")); em.persist(member); return member; }
상품주문 테스트
@RunWith(SpringRunner.class) @SpringBootTest @Transactional class OrderServiceTest { @Autowired EntityManager em; @Autowired OrderService orderService; @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Exception { //given Member member = creatMember(); Item book = createBook("시골 JPA", 10000, 10); int orderCount = 2; //when Long orderId = orderService.order(member.getId(), book.getId(), orderCount); //then Order getOrder = orderRepository.findOne(orderId); Assert.assertEquals("상품 주문시 상태는 ORDER", OrderStatus.ORDER, getOrder.getStatus()); Assert.assertEquals("주문한 상품 종류 수가 정확해야 한다.", 1, getOrder.getOrderItems().size()); Assert.assertEquals("주문 가격은 가격 * 수량이다.", 10000 * orderCount, getOrder.getTotalPrice()); Assert.assertEquals("주문 수량만큼 재고가 줄어야한다.", 8, book.getStockQuantity()); }
사용자가 상품을 주문했을 때, order가 호출이 되고 상품 상태와 상품 종류, 재고 등이 기대한 값과 일치하는지 알아보는 테스트 케이스이다. 상품 상태는 ORDER가 되고, 상품 재고는 2개를 주문했으니 8개로 줄어들 것이다.
상품주문_재고수량초과 테스트
@Test public void 상품주문_재고수량초과() throws Exception { //given Member member = creatMember(); Item item = createBook("시골 JPA", 10000, 10); int orderCount = 11; //when try { orderService.order(member.getId(), item.getId(), orderCount); } catch (NotEnoughStockException e) { return; } //then fail("재고 수량 부족 예외가 발생해야 한다."); }
수량보다 더 많은 상품을 구매하게 된다면 재고수량이 초과되어서 NotEnoughStockException을 던지도록 설정했었다. book은 10개가 수량인데 주문 수량이 11개가 된다면 try-catch문에 NotEnoughStockException이 발견되어서 테스트가 정상적으로 실행될 것이다.
주문취소 테스트
@Test public void 주문취소() throws Exception { //given Member member = creatMember(); Item item = createBook("시골 JPA", 10000, 10); int orderCount = 2; Long orderId = orderService.order(member.getId(), item.getId(), 2); //when orderService.cancelOrder(orderId); //then Order getOrder = orderRepository.findOne(orderId); Assert.assertEquals("주문 취소시 상태는 CANCEL이다.", OrderStatus.CANCEL, getOrder.getStatus()); Assert.assertEquals("주문이 취소된 상품은 그만큼 재고가 증가해야 한다.", 10, item.getStockQuantity()); }
주문을 취소하게 된다면 orderCount만큼 수량이 삭제되지 않고 원래 수량 그대로 유지될 것이다. 또한 OrderStatus는 취소되었으니 CANCEL의 상태가 될 것이다.
이번 예제에서 테스트는 전부 잘 실행되었으나 실제로 프로젝트를 할 때에는 테스트를 훨씬 더 많은 경우에서 꼼꼼하게 진행된다고 하니까 만든 로직을 오류없이 잘 테스트할 수 있도록 하는 것도 중요하다.
'JPA > JPA 활용' 카테고리의 다른 글
웹 계층 개발 - 상품 등록, 목록 조회 (0) 2023.07.11 웹 계층 개발 - 회원 등록, 목록 조회 (0) 2023.07.11 주문 리포지토리, 서비스 개발 (0) 2023.07.11 주문 도메인 개발 - 주문 로직 추가 (0) 2023.07.11 상품 리포지토리, 서비스 개발 (0) 2023.07.11