이전글
2023.02.24 - [Back-End/JPA] - JPA 활용 - 주문 도메인 개발
💡 이 글의 테스트 코드는 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 활용을 공부하며 작성한 글입니다.
반응형