package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
importstatic org.assertj.core.api.Assertions.*;
classRateDiscountPolicyTest{
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test@DisplayName("VIP는 10% 할인이 적용되어야 한다.")voidvip_o(){
// give
Member member = new Member(1L, "memberVIP", Grade.VIP);
// whenint discount = discountPolicy.discount(member, 10000);
// then
assertThat(discount).isEqualTo(1000);
}
@Test@DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다.")voidvip_x(){
// give
Member member = new Member(2L, "memberBASIC", Grade.BASIC);
// whenint discount = discountPolicy.discount(member, 10000);
// then
assertThat(discount).isEqualTo(0);
}
}
새로운 할인 정책 적용과 문제점
할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 한다.
publicclassOrderServiceImplimplementsOrderService{
// private final DiscountPolicy discountPolicy = new FixedDiscountPolicy();privatefinal DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
DIP 위반
주문 서비스 클라이언트(OrderServiceImpl)는 추상(인터페이스) 뿐만 아니라 구체(구현) 클래스에도 의존하고 있다.