@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class OrderServiceTest {

	@Autowired
	EntityManager em;

	@Autowired
	OrderService orderService;

	@Autowired
	OrderRepository orderRepository;

	// ...

	private Member createMember(String name) {
		Member member = new Member();
		member.setName(name);
		member.setAddress(new Address("서울", "마곡중앙5로", "12345"));

		em.persist(member);
		return member;
	}

	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;
	}
 }

주문 테스트

@Test
public void 상품주문() throws Exception {
	Member member = createMember("cmlee");
	Item book = createBook("시골 JPA", 10000, 10);

	int orderCount = 2;

	Long orderId = orderService.order(member.getId(), book.getId(), orderCount);

	Order order = orderRepository.findOne(orderId);

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

재고 수량 초과

@Test(expected = NotEnoughStockException.class)
public void 상품주문_재고수량초과() throws Exception {
	Member member = createMember("cmlee");
	Item book = createBook("시골 JPA", 10000, 10);

	int orderCount = 11;

	orderService.order(member.getId(), book.getId(), orderCount);

	fail("재고 수량 부족 예외가 발생해야 한다.");
}

주문 취소

@Test
public void 주문취소() throws Exception {
	Member member = createMember("cmlee2");
	Item book = createBook("Nextjs", 20000, 5);

	int orderCount = 2;

	Long orderId = orderService.order(member.getId(), book.getId(), orderCount);

	orderService.cancelOrder(orderId);

	Order getOrder = orderRepository.findOne(orderId);

	assertEquals("주문 취소시 상태는 CANCEL 이다.", OrderStatus.CANCEL, getOrder.getStatus());
	assertEquals("주문 취소된 상품은 그만큼 재고 갯수가 증가해야 한다.", 5, book.getStockQuantity());
}