새로운 요구사항으로 1000원 할인 고정에서 퍼센트로 계산하여 할인율을 적용하는 정책을 추가해야한다.
public class RateDisCountPolicy implements DisCountPolicy {
private int discountPercent = 10; // 10% 할인
@Override
public int discount(Member member, int price) {
if(member.getGrade()== Grade.VIP){
return price * discountPercent / 100;
}else {
return price;
}
}
}
import static org.junit.jupiter.api.Assertions.*;
class RateDisCountPolicyTest {
RateDisCountPolicy rateDisCountPolicy = new RateDisCountPolicy();
@Test
@DisplayName("VIP는 10% 할인이 적용되어야 한다.")
void vip_o() {
Member memberVIP = new Member(1L, "memberVIP", Grade.VIP);
//given
int discount = rateDisCountPolicy.discount(memberVIP, 10000);
//when
assertEquals(discount, 1000);
//then
}
@Test
@DisplayName("VIP가 아니면 할인을 받지 않는다.")
void vip_x() {
Member memberBasic = new Member(2L, "memberBasic", Grade.BASIC);
//given
int discount = rateDisCountPolicy.discount(memberBasic, 10000);
//when
assertEquals(discount, 10000);
//then
}
}
public class OrderServiceImpl implements OrderService {
public final MemberRepository memberRepository = new MemoryMemberRepository();
private final DisCountPolicy disCountPolicy = new RateDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = disCountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}