회원 주문 예제 - 새로운 정책 구현

인프런 스프링 핵심 원리 - 기본편 수강 중

새로운 할인 정책 개발

기존 고정 할인 정책에서 정률 할인 정책으로 변경

RateDiscountPolicy 추가

그림1

RateDiscountPolicy 코드

public class RateDiscountPolicy implements DiscountPolicy{

    private int discountPercent = 10;
    @Override
    public int discount(Member member, int price) {
        if(member.getGrade() == Grade.VIP){
            return price * discountPercent / 100;
        }
        else{
            return 0;
        }
    }
}

할인 정책 테스트

  • VIP 등급 테스트
    class RateDiscountPolicyTest {
      RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
    
      @Test
      @DisplayName("VIP는 10% 할인이 적용되어야 한다")
      void vip_O() {
          //given
          Member member = new Member(1L, "memberVIP", Grade.VIP);
          //when
          int discount = discountPolicy.discount(member, 10000);
          //then
          Assertions.assertThat(discount).isEqualTo(1000);
      }
    }
    
  • Basic 등급 테스트
    class RateDiscountPolicyTest {
     @Test
      @DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다")
      void vip_x(){
          //given
          Member member = new Member(2L, "memberBasic", Grade.BASIC);
          //when
          int discount = discountPolicy.discount(member, 10000);
          //then
          Assertions.assertThat(discount).isEqualTo(0);
      }
    }
    
  • 테스트를 할 떄 오류 테스트도 해봐야 한다.
  • 예를들면 Basic 등급 할인 금액을 1000원으로 해서 테스트를 했을 때 FAIL이 되는지 확인 해봐야 한다.

import static

import static org.assertj.core.api.Assertions.assertThat;

assertThat(discount).isEqualTo(0);
  • 정적 메소드를 import static 을 사용해서 import 하면 클래스명 없이 메서드 사용 가능
    ex) Assertions.assertThat() ➡️ assertThat()
  • 하지만 같은 클래스 내에 동일한 이름의 메소드가 있으면 클래스 자신의 메서드가 우선

할인 정책 적용

OrderServiceImpl

//private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

잘 작동한다

[참조] 인프런 스프링 핵심 원리 - 기본편 - 링크

끝!