작성
·
183
1
강의: 스프링 핵심 원리 - 기본편 (김영한님)
질문내용: 테스트코드 중 서로다른 객체 참조로 인한 null값 오류
<멤버레포지토리구현체 클래스>
public class MemoryMemberRepository implements MemberRepository{
private Map<Long, Member> memberRepository = new HashMap<>();
@Override
public void save(Member member) {
memberRepository.put(member.getId(), member);
}
@Override
public Member findById(Long id) {
return memberRepository.get(id);
}
@Override
public List<Member> findAll() {
return new ArrayList<>(memberRepository.values());
}
}
<멤버서비스구현체 클래스>
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findOne(Long id) {
return memberRepository.findById(id);
}
@Override
public List<Member> findMembers() {
return memberRepository.findAll();
}
}
<주문서비스구현체 클래스>
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
System.out.println(memberId);
System.out.println(member);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
<테스트코드>
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, "Spring강의", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "iteamA", 10000);
System.out.println("order = " + order);
}
}
테스트코드 프로세스:
1) 멤버서비스객체: 회원가입 (join메소드)
2) 주문서비스객체: 회원조회하여 할인정책 적용하여 리턴
질문은 다음과 같습니다!
테스트케이스를 실행시,
다음과 같은 NullPointerException이 발생하는데요,
위의 멤버서비스와 주문서비스 클래스를 보시면 서로 다른 MemoryMemberRepository 객체를 생성하는 즉, 서로 다른 객체를 참조하고 있기 때문에 당연한 에러라고 생각합니다.
(멤버서비스에서 회원가입을 진행한 레포지토리와, 주문서비스에서 조회하는 레포지토리가 다르기 때문)
하지만, 강의에선 에러 없이 정상작동하는데... 놓친 부분이 없을텐데 무엇이 문제인 것인지지 여쭙고싶습니다 ㅠ
(추가)
다음과 같이 테스트케이스 메인메소드에서 동일한 객체를 참조하도록 멤버레포지토리 의존성주입을 하여 에러는 해결했습니다만, 강의에선 생성자주입없는 상태에서도 에러가 발생하지 않았는데 이유를 모르겠습니다 ㅠ
의존성 주입의 이유중 하나로 다음과 같이 "동일한 객체를 참조하기 위함"도 있는 것인지 여쭙고싶습니다.
public class OrderApp {
public static void main(String[] args) {
MemberRepository memoryRepository = new MemoryMemberRepository();
MemberService memberService = new MemberServiceImpl(memoryRepository); //일단 회원가입 해야하니 필요
OrderService orderService = new OrderServiceImpl(memoryRepository);
Long memberId = 1L;
Member member = new Member(memberId, "Spring강의", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "iteamA", 10000);
System.out.println("order = " + order);
}
}
static을 전혀 생각하지 못하고 있었네요...
해결했습니다 ㅎ 답변 주셔서 감사합니다.