
고정할인금액으로 구현하였으나, 더 효율적으로 정률할인을 추가하고 싶다.
DiscountPolicy 인터페이스를 상속받는 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;
}
}
}
테스트 코드 단축키: ctrl+shift+t
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);
}
@Test
@DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다.")
void vip_x(){
//given
Member member = new Member(1L,"memberBasic", Grade.BASIC);
//when
int discount = discountPolicy.discount(member,10000);
//then
Assertions.assertThat(discount).isEqualTo(1000);
}
}
두 번째 테스트에선 X 가 나오고 예측값은 1000인데 실제값은 0이라고 뜬다.
두 번째 테스트를 통과하려면 다음과 같이 수정하면 된다.
void vip_x(){
//given
Member member = new Member(1L,"memberBasic", Grade.BASIC);
//when
int discount = discountPolicy.discount(member,10000);
//then
Assertions.assertThat(discount).isEqualTo(0);
}
예측값을 0으로 넣어주면 테스트가 정상적으로 실행된다.
문제점
문제 해결
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
private DiscountPolicy discountPolicy;
// private DiscountPolicy discountPolicy = new FixDiscountPolicy();
}
해결 방안