Back-End/JPA

JPA 활용 - 주문 기능 테스트

LightSource 2023. 2. 27. 21:34

이전글

2023.02.24 - [Back-End/JPA] - JPA 활용 - 주문 도메인 개발

 

JPA 활용 - 주문 도메인 개발

이전글 2023.02.23 - [Back-End/JPA] - JPA 활용 - 상품 도메인 개발 주문 도메인 개발 구현 기능 상품 주문 주문 내역 조회 주문 취소 순서 주문 엔티티, 주문상품 엔티티 개발 주문 리포지토리 개발 주문

scoring.tistory.com

 

💡 이 글의 테스트 코드는 JUnit5로 작성되었습니다. (인프런 강의는 JUnit4)

주문 기능 테스트

테스트 요구사항

  • 상품 주문이 성공해야 한다.
  • 상품을 주문할 때 재고 수량을 초과하면 안 된다.
  • 주문 취소가 성공해야 한다.

상품 주문 테스트

@SpringBootTest
@Transactional
class OrderServiceTest {

    @Autowired
    EntityManager em;
    @Autowired
    OrderService orderService;
    @Autowired
    OrderRepository orderRepository;

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

    }
}
  • Given절 : Member객체와 Book객체를 만들어 주었습니다.
  • When절 : 실제 상품을 주문하였습니다.
  • Then절 : 주문 상태 검증, 상품 종류 수 검증, 주문 가격 검증, 주문 수량 검증을 실행하였습니다.

재고 수량 초과 테스트

@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));

    }

Item의 재고를 10으로 설정하고, orderCount의 숫자를 11로 설정하여 재고보다 1권 더 많은 수량을 주문 한 경우 입니다.
주문이 초과한 경우 기댓값으로 NotEnoughStockException을 설정하여 예외가 발생였습니다.

JUnit5에서 기댓값으로 Exception을 원하는 경우 assertThrows의 2번째 인자로 함수가 들어가므로, when절을 생략 했습니다.

JUnit4의 경우 @Test(expected = NotEnoughStockException.class)로 표기합니다.

@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("재고 수량 부족 예외가 발생해야 한다.");
}

주문 취소 테스트

@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(), "주문이 취소된 상품은 그만큼 재고가 증가해야 한다.");

    }
  • Given : 주문을 실행
  • When : 해당 주문을 취소
  • Then : 주문 상태 검증, 취소한 만큼 재고 증가 검증

 

참고

 

해당 글은 김영한님의 실전! 스프링 부트와 JPA 활용을 공부하며 작성한 글입니다.

https://www.inflearn.com/course/스프링부트-JPA-활용-1/dashboard

반응형