바로 테스트를 해도 되지만 익숙해지기 위해 main부터 시작 하겠습니다.
먼저 주문이 원하는대로 동작하는지 main 메서드를 만듭니다. (OrderApp)
package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.order.Order;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
public class OrderApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order.toString());
//System.out.println("order.calculatePrice() = " + order.calculatePrice());
}
}
먼저 회원이 필요하니 회원 가입을 하고 주문을 하나 만들어서 주문 정보를 출력하면 원하는 값이 출력됩니다.
물론 애플리케이션 로직으로 이렇게 테스트 하는 것은 좋은 방법이 아닙니다.
그러니 이제 JUnit으로 그대로 옮겨보겠습니다.
test에 order 패키지를 만들어줍니다.
그 후에 member 패키지에 OrderServiceTest를 만듭니다.
package hello.core.order;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
public class OrderServiceTest {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
@Test
void createOrder() {
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
//...1
Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
}
}
<aside> ❗ Long으로 Wrapper타입을 쓰는 이유는 long같은 Primitive타입은 null값이 들어갈 수 없기 때문입니다.
(사실 딱히 중요한건 아닙니다. long을 써도 됩니다.)
</aside>
테스트를 실행하면 잘 통과합니다.
<aside> 💡 단위 테스트를 잘 만드는게 정말 중요합니다!
단위 테스트라고 하는 것은 스프링이나 컨테이너 도움 없이 순수하게 자바코드로만 테스트를 하는 것을 의미합니다.
단위 테스트는 수천개가 있어도 몇초만에 끝납니다.
</aside>
지금까지 다형성을 잘 활용해서 설계를 했습니다.
그렇다면 과연 "정액 할인 정책"을 "정율 할인 정책"으로 깔끔하게 바꿀 수 있을까요??