public class OrderServiceTest {
@Autowired EntityManager em;
@Autowired OrderService orderService; //오더서비스 받아오기
@Autowired
OrderRepository orderRepository;
@Test
public void 상품주문() throws Exception{
//given
Member member=new Member();
member.setName("회원1");
member.setAddress(new Address("서울","경기","123-123"));
em.persist(member);
Book book= new Book();
book.setName("시골 JPA");
book.setPrice(10000);
book.setStockQuantity(10);
em.persist(book);
int orderCount=2;
//when
Long orderId = orderService.order(member.getId(), book.getId(), orderCount);
//then
Order getOrder=orderRepository.findOne(orderId);
//(메세지, 기대값, 실제값)
assertEquals("상품 주문시 상태가 ORDER여야", OrderStatus.ORDER,getOrder.getStatus());
assertEquals("주문한 상품 종류 수가 정확해야 한다.",1,getOrder.getOrderItems().size());
assertEquals("주문 가격은 가격*수량이어야 한다.",10000*orderCount,getOrder.getTotalPrice());
assertEquals("주문 수량만큼 재고가 줄어야 한다.",8,book.getStockQuantity());
}
문제 : 멤버, 북 생성이 반복됨. 귀찮
* 리팩토링 : 함수로 만듬(c+alt+M 왜안됌 / 전구클릭)
private Book createBook() {
Book book= new Book();
book.setName("시골 JPA");
book.setPrice(10000);
book.setStockQuantity(10);
em.persist(book);
return book;
}
private Member createMember() {
Member member=new Member();
member.setName("회원1");
member.setAddress(new Address("서울","경기","123-123"));
em.persist(member);
return member;
}
문제 : 하드코딩, 고정값
해결 : 매개변수 C+A+P
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;
}
* 실무에서는 단위테스트를 하라.
메소드 하나씩 잘 작동되는지 테스트하면 좋다.
public void cancel(){
if(delivery.getStatus()==DeliveryStatus.COMP){
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
//else
this.setStatus(OrderStatus.CANCEL);
for(OrderItem orderItem : orderItems){
orderItem.cancel();
}
}
* 완성코드
package jpabook.jpashop.service;
import jpabook.jpashop.domain.*;
import jpabook.jpashop.domain.item.Book;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.exception.NotEnoughStockException;
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 javax.persistence.EntityManager;
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 = 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("상품 주문시 상태가 ORDER여야", OrderStatus.ORDER,getOrder.getStatus());
assertEquals("주문한 상품 종류 수가 정확해야 한다.",1,getOrder.getOrderItems().size());
assertEquals("주문 가격은 가격*수량이어야 한다.",10000*orderCount,getOrder.getTotalPrice());
assertEquals("주문 수량만큼 재고가 줄어야 한다.",8,book.getStockQuantity());
}
@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.cancleOrder(orderId);
//then
Order getOrder=orderRepository.findOne(orderId);
assertEquals("주문 취소시 상태는 CANCLE이어야",OrderStatus.CANCEL,getOrder.getStatus());
assertEquals("주문이 취소된 상품은 재고가 증가해야",10,item.getStockQuantity());
}
//이 예외가 터져야한다.
@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("여기로 오면 안됨. 재고부족예외가 터져야한다.");
}
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;
}
private Member createMember() {
Member member=new Member();
member.setName("회원1");
member.setAddress(new Address("서울","경기","123-123"));
em.persist(member);
return member;
}
}
'Java > Spring-app' 카테고리의 다른 글
홈화면과 레이아웃 // front, css매핑, 로그찍기 (0) | 2023.07.17 |
---|---|
주문 검색 기능 개발 // 동적쿼리해결방법 (0) | 2023.07.04 |
주문 서비스 개발 // 도메인 모델 패턴, 생성자제한, CASCADE, 변수 수정쿼리 (0) | 2023.06.13 |
주문 리포지토리 개발 (0) | 2023.06.13 |
주문, 주문상품 엔티티 개발 // 복잡한생성은 생성메서드 (0) | 2023.06.08 |