본문 바로가기

프로젝트 기록/백엔드 심화 부트캠프

241115 프로젝트 TIL

오늘은 장바구니 생성 테스트 코드와 고객 주문 생성 테스트 코드를 작성했다.

그 중 고객 주문 생성 기능에서 성공 테스트 케이스를 검증할 때 

1) 예외를 던지지 않는지?

2) 최종 주문 가격이 [(메뉴 가격 * 카트에 담은 개수) + 배달비 - 쿠폰 할인가격 (쿠폰 적용 시에만 해당)]과 일치하는 지?

를 검증했다.

 

테스트가 실제 DB에 영향을 주지 않게 하고 싶었기 때문에 Mock 테스트를 작성했다.

테스트를 위해 생성한 더미 테스트 데이터의 시나리오는 다음과 같다.

먼저, 성공 케이스는 쿠폰을 사용한 경우와 쿠폰을 사용하지 않은 경우 2가지로 생각해야했다.

User에게 발급됐다고 가정한 쿠폰이 2000원이기 때문에 쿠폰을 사용한 request를 받으면 최종가격은 16000원, 쿠폰을 사용하지 않은 request를 받으면 최종가격은 18000원이어야했다. 

 

@Test
    @DisplayName("Customer_주문_생성_성공_쿠폰_사용O")
    void createDeliveryOrdersWithCouponSuccess() {
        // given
        P_cart cartItem = mockCartSetting();
        P_user user = mockCustomerUserSetting();

        when(orderRepository.findAllByUserIdIsIng(user.getId(), OrderState.STANDBY)).thenReturn(List.of());
        when(cartRepository.findAllBySelectAndUserId(user.getId())).thenReturn(List.of(cartItem));
        when(couponRepository.findById(coupon.getId())).thenReturn(Optional.of(coupon));
        when(orderRepository.save(any(P_order.class))).thenReturn(new P_order());


        // when
        Assertions.assertDoesNotThrow(() -> orderCustomerService.createDeliveryOrders(withCoupon, user));

        // then
        long expectedTotalAmount = (cartItem.getMenu().getPrice() * cartItem.getQuantity()) + cartItem.getMenu().getStore().getDeliveryPrice() - coupon.getDiscountAmount();
        Assertions.assertEquals(expectedTotalAmount, 16000);
    }

 

@Test
    @DisplayName("Customer_주문_생성_성공_쿠폰_사용X")
    void createDeliveryOrdersSuccess() {
        // given
        P_cart cartItem = mockCartSetting();
        P_user user = mockCustomerUserSetting();

        when(orderRepository.findAllByUserIdIsIng(user.getId(), OrderState.STANDBY)).thenReturn(List.of());
        when(cartRepository.findAllBySelectAndUserId(user.getId())).thenReturn(List.of(cartItem));
        when(couponRepository.findById(coupon.getId())).thenReturn(Optional.of(coupon));
        when(orderRepository.save(any(P_order.class))).thenReturn(new P_order());


        // when
        Assertions.assertDoesNotThrow(() -> orderCustomerService.createDeliveryOrders(withoutCoupon, user));

        // then
        long expectedTotalAmount = (cartItem.getMenu().getPrice() * cartItem.getQuantity()) + cartItem.getMenu().getStore().getDeliveryPrice();
        Assertions.assertEquals(expectedTotalAmount, 18000);
    }

 

테스트를 실행한 결과 예상한 값과 일치하여 테스트 케이스가 성공했다.


 

전에 테스트 코드 작성 강의를 들은 이후로 다른 프로젝트에서 내가 직접 개발한 기능을 기반으로 하나하나 테스트 코드를 작성해본건 처음인데, 하나의 주문 생성 서비스 기능에 성공 케이스를 2개, 실패 케이스를 3개나 작성하려니 시간이 오래 걸렸지만 테스트코드를 작성해보면서 내가 미처 놓친 부분도 발견하게 되었다. (최소 주문 금액 예외나, 배달비 처리를 빼먹었었다..덜덜)

 

테스트 코드를 작성해보지 않았으면 아마 그대로 배포... 되지 않았을까. 그만큼 테스트 코드가 정말 중요한 것 같다.

'프로젝트 기록 > 백엔드 심화 부트캠프' 카테고리의 다른 글

241119 프로젝트 TIL  (0) 2024.11.19
241118 프로젝트 TIL  (1) 2024.11.18
241114 프로젝트 TIL  (2) 2024.11.14
241113 프로젝트 TIL  (2) 2024.11.13
241112 프로젝트 TIL  (2) 2024.11.12