위의 코드를 보면 첫번째로는 상품주문 메소드와 주문 취소 메소드 모두 빨간색 박스 부분이 중복됨을 알 수 있습니다.
두번째로는 파란색 박스 부분을 언뜻 보면 8이라는 숫자가 무엇을 의미하는지 헷갈릴 수도 있습니다.
그래서 이를 해결하기 위해 다음과 같이 리팩토링을 하였습니다.
@SpringBootTest
@Transactional
public class OrderServiceTestJUnit5 {
@Autowired OrderService orderService;
@Autowired EntityManager em;
Member member;
Item book;
@BeforeEach
void setUp() {
// 회원 등록
Member member = new Member();
member.setName("회원");
member.setAddress(new Address("서울","경기","123-123"));
em.persist(member);
this.member = member;
// 상품(책) 등록
Book book = new Book();
book.setName("JPA");
book.setStockQuantity(BOOK_STOCK_QUANTITY);
book.setPrice(BOOK_PRICE);
em.persist(book);
this.book = book;
}
}
빨간색 부분의 중복된 부분을 없애기 위해서 @BeforeEach에서 중복되는 부분을 분리했습니다.
@Test
void 상품_주문() throws Exception {
// when
int orderCount = 2;
Long orderId = orderService.order(member.getId(), book.getId(), orderCount);
// then
Order findOrder = orderService.findOne(orderId);
assertThat(findOrder.getStatus()).isEqualTo(OrderStatus.ORDER);
assertThat(findOrder.getOrderItems()).hasSize(1);
assertThat(book.getStockQuantity()).isEqualTo(BOOK_STOCK_QUANTITY - orderCount);
assertThat(findOrder.getPriceTotal()).isEqualTo(BOOK_PRICE * orderCount);
}
@Test
void 주문_취소() {
// given
int orderCount = 3;
Long orderId = orderService.order(member.getId(), book.getId(), orderCount);
// when
orderService.cancel(orderId);
// then
Order findOrder = orderService.findOne(orderId);
assertThat(findOrder.getStatus()).isEqualTo(OrderStatus.CANCEL);
assertThat(book.getStockQuantity()).isEqualTo(BOOK_STOCK_QUANTITY);
}
그 결과 이렇게 빨간색의 중복된 부분이 사라진 것을 발견하실 수 있습니다.
@SpringBootTest
@Transactional
public class OrderServiceTestJUnit5 {
static final int BOOK_STOCK_QUANTITY = 10;
static final int BOOK_PRICE = 10000;
@Test
void 상품_주문() throws Exception {
// when
int orderCount = 2;
Long orderId = orderService.order(member.getId(), book.getId(), orderCount);
// then
Order findOrder = orderService.findOne(orderId);
assertThat(findOrder.getStatus()).isEqualTo(OrderStatus.ORDER);
assertThat(findOrder.getOrderItems()).hasSize(1);
// (1)
assertThat(book.getStockQuantity()).isEqualTo(BOOK_STOCK_QUANTITY - orderCount);
assertThat(findOrder.getPriceTotal()).isEqualTo(BOOK_PRICE * orderCount);
}
}
그리고 파란색 박스 부분은 상수를 사용함으로써 해결하였습니다.
파란색 박스 부분에서 그냥 8이라고 써져있을 때는 이 8의 의미가 뭔지 헷갈릴 수 있었는데 (1)
코드에서 처럼 BOOK_STOCK_QUANTITY - orderCount라고 명시적으로 써줌으로써 아~ 책의 현재재고가 원래 재고에서 주문수량만큼 빠졌는지 확인하는 거구나 라고 한층 이해하기 쉽게 도와주게 됩니다.