주문 기능 테스트
지금까지 만든 주문기능을 테스트 코드로 작성해보자.
주문생성과 주문 취소, 그리고 주문할때 재고수량이 초과되면 오류가 나는지의 핵심 검증 메서드를 테스트해봐야 한다.
이번 테스트를 하기 전에, 좋은 테스트가 무엇인지를 언급하겠다.
지금 강의에서는 JPA를 설명하는게 목적이기 때문에 SpringbootTest 즉 통합테스트를 진행하지만 사실 좋은 테스트란 단위테스트, 즉, 의존성없이 메모리에서만 로직을 따지는 테스트가 좋다. 이점을 염두에 두자.
먼저 상품주문이 잘 되는지부터 테스트를 만들어보자.
package jpabook.jpashop.service;
import jakarta.persistence.EntityManager;
import jpabook.jpashop.domain.Address;
import jpabook.jpashop.domain.Item.Book;
import jpabook.jpashop.domain.Item.Item;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderStatus;
import jpabook.jpashop.repository.OrderRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class OrderServiceTest {
@Autowired
EntityManager em;
@Autowired
OrderService orderService;
@Autowired
OrderRepository orderRepository;
@Test
public void 상품주문() throws Exception {
//given
Member member = new Member();
member.setName("현진");
member.setAddress(new Address("서울", "회기","123-123"));
em.persist(member); //멤버 생성
Book book = new Book();
book.setName("이것이 리눅스다");
book.setPrice(10000);
book.setStockQuantity(10);
int orderCount = 2;
em.persist(book); //상품 생성
//when
Long orderId = orderService.order(member.getId(), book.getId(), orderCount);
//then
Order findOrder = orderRepository.findOne(orderId);
//assertEquals는 Junit4의 메서드이다.
assertEquals("상품 주문시 상태는 ORDER", OrderStatus.ORDER, findOrder.getStatus());
}
@Test
public void 주문취소() throws Exception {
//given
//when
//then
}
@Test
public void 상품주문_재고수량초과() throws Exception {
//given
//when
//then
}
}
생성된 주문의 상태 테스트가 성공했다. 이어서 생성된 주문의 종류 수, 주문가격을 테스트해보자.
assertEquals("주문한 상품 종류 수가 정확해야 한다.", 1, findOrder.getOrderItems().size());
assertEquals("주문 가격은 가격 * 수량이다.", 10000*orderCount, findOrder.getTotalPrice());
통과했다.
다음으로 재고가 줄었는지 테스트 해보자.
assertEquals("주문 수량만큼 재고가 줄어야 한다.", 8, book.getStockQuantity());