Mini

주문 기능 테스트 //@Test, Assert 본문

Java/Spring-app

주문 기능 테스트 //@Test, Assert

Mini_96 2023. 6. 20. 01:13
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;
    }
}