인프런 커뮤니티 질문&답변

김나연님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

상품 주문

test 코드

21.07.17 11:47 작성

·

158

0

OrderService의 order 메소드에 대한 단위 테스트를 작성해보려는 중에 질문이 생겨서 문의드립니다!

orderRepository에서 save(order)를 하려면 Order객체를 만들어줘야하는데 Order 객체를 만드는게 Member, Delivery, OrderItem 이게 필요하니깐 테스트 코드에서 일일이 생성해서 만들어준 다음에 when(orderRepository.findOne(orderId)).thenReturn(만든 order객체) 요런식으로 해줘야 할까요?

아래는 그냥 제가 끄적여 본건데 단위테스트가 독립적인 테스트라 해서 Mockito를 이용해 짜본건데 맞게 했는지 잘 모르겠습니다... 
OrderService의 order 메소드에 대한 단위 테스트는 어떤식으로 짜면 좋을지 조언 부탁드립니다...!

@Mock
private OrderRepository orderRepository;
@InjectMocks
private OrderService orderService;
@Mock
private MemberRepository memberRepository;
@Mock
private ItemRepository itemRepository;

@Test
public void 상품_주문(){
    //given
    Member member = createMember();
    Item item = createBook("시골JPA", 10000, 10);
    int orderCount = 2;

    //when
    when(memberRepository.findOne(member.getId())).thenReturn(member);
    when(itemRepository.findOne(item.getId())).thenReturn(item);
    doNothing().when(orderRepository).save(any(Order.class));
    Long orderId = orderService.order(member.getId(), item.getId(), orderCount);
    //then
    //when(orderRepository.findOne(orderId)).thenReturn()
    Order getOrder = orderRepository.findOne(orderId);

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

답변 1

0

David님의 프로필 이미지

2021. 07. 19. 14:45

안녕하세요. 김나연님, 공식 서포터즈 David입니다.
.

맞습니다. repository쪽은 mock으로 처리해서 테스트를 작성하시면 됩니다.

아래 코드를 기준으로 말씀드리자면 '꼭 OrderService의 order()에 대한 테스트가 필요한가?'에 대해 고민해보시면 좋을 것 같습니다. 테스트가 필요없다는 말이 아닙니다.

order 메서드 내 코드들을 보면 member, item, delivery, orderitem, order의 생성, 조회, 저장이 전부입니다. repository의 조회, 저장 동작에 대해 검증할게 아니라면 Delivery, OrderItem, Order 클래스의 단위테스트로 모두 커버될 것입니다.

.
감사합니다.