본문 바로가기
스프링/핵심 원리

[Spring] 새로운 할인 정책 개발

by drCode 2022. 1. 23.
728x90
반응형

"새로운 할인 정책을 확정해보자"

  • "악덕 기획자" : 서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률 % 할인으로 변경하고 싶어요. 예를 들어서 기존 정책은 VIP가 10,000원을 주문하든 20,000원을 주문하든 항상 1,000원을 할인했는데, 이번에 새로 나온 정책은 10%로 지정해두면 고객이 10,000원 주문 시 1,000원을 할인해주고, 20,000원 주문 시에 2,000원을 할인해주는 거에요
  • "순진 개발자" : 제가 처음부터 고정 금액 할인은 아니라고 했잖아요
  • "악덕 기획자" : 애자일 소프트웨어 개발 선언 몰라요? "계획을 따르기보다 변화에 대응하기를"
  • "순진 개발자" : ...(하지만 난 유연한 설계가 가능하도록 객체지향 설계 원칙을 준수했지 후후)

참고 : 애자일 소프트웨어 개발 선언 https://agilemanifesto.org/iso/ko/manifesto.html

 

애자일 소프트웨어 개발 선언

애자일 소프트웨어 개발 선언 우리는 소프트웨어를 개발하고, 또 다른 사람의 개발을 도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고 있다. 이 작업을 통해 우리는 다음을 가치 있게

agilemanifesto.org

 

순진한 개발자가 정말 객체지향 설계 원칙을 잘 준수 했는지 확인해보자. 입번에는 주문한 금액의 %를 할인해주는 새로운 정률 할인 정책을 추가하자.

 

"RateDiscountPolicy 추가"

 

RateDiscountPolicy.java

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;

public class RateDiscountPolicy implements DiscountPolicy{

    private int discountPercent = 10;

    // 쉽고 빠른 테스트 코드 만들기
    // 테스트 하기를 원하는 메서드에 마우스 포인트를 찍어놓고 Ctrl + Shift + T

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

 

인텔리제이 상에서 쉽고 빠른 테스트코드를 만들기 위해서는

 

테스트하기 원하는 메서드 위에 커서를 찍어놓고 Ctrl + Shift + T를 누르면 테스트코드 클래스를 쉽게 생성할 수 있다.

 

 

RateDiscountPolicyTest.java

 

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

// 클래스 수준에서 테스트코드를 돌리면 작성해놓은 모든 테스트케이스가 다 돌아간다.
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
        // static import ↓↓↓
        Assertions.assertThat(discount).isEqualTo(1000);
    }

    // 실패 테스트도 꼭 만들어봐야한다.
    @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);
    }
}

 

 

728x90
반응형

댓글