인프런 커뮤니티 질문&답변

김준기님의 프로필 이미지
김준기

작성한 질문수

스프링 핵심 원리 - 기본편

[스프링핵심원리-기본편] 주문과 할인 도메인 테스트 관련해서 질문드립니다.

작성

·

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 객체를 생성하는 즉, 서로 다른 객체를 참조하고 있기 때문에 당연한 에러라고 생각합니다.

(멤버서비스에서 회원가입을 진행한 레포지토리와, 주문서비스에서 조회하는 레포지토리가 다르기 때문)

하지만, 강의에선 에러 없이 정상작동하는데... 놓친 부분이 없을텐데 무엇이 문제인 것인지지 여쭙고싶습니다 ㅠ

(추가)

  1. 다음과 같이 테스트케이스 메인메소드에서 동일한 객체를 참조하도록 멤버레포지토리 의존성주입을 하여 에러는 해결했습니다만, 강의에선 생성자주입없는 상태에서도 에러가 발생하지 않았는데 이유를 모르겠습니다 ㅠ

  2. 의존성 주입의 이유중 하나로 다음과 같이 "동일한 객체를 참조하기 위함"도 있는 것인지 여쭙고싶습니다.

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);
	}
}

답변 1

0

안녕하세요. 김준기님, 공식 서포터즈 OMG입니다.

코드를 더 살펴봐야 겠지만, 올리신 코드를 보면 static이 누락되어 있네요.

image2번은 맞습니다.

static추가하여 확인하시고 에러가 발생한다면 강의와 다르게 작성한 코드 부분이 있는지 확인해주셔야 할 것 같아요.

해결이 안될 경우 댓글남겨주세요.

감사합니다.

김준기님의 프로필 이미지
김준기
질문자

static을 전혀 생각하지 못하고 있었네요...

해결했습니다 ㅎ 답변 주셔서 감사합니다.

김준기님의 프로필 이미지
김준기

작성한 질문수

질문하기