MemberService 클래스와 MemberServiceTest를 만들어서 테스트할 때 의문점
MemberService에서도 MemoryMemberRepository 객체를 생성하고, 테스트코드에서도 객체를 생성한다. MemberService의 객체에 대해서 테스트를 수행해야하는데 두 객체가 다르다면 각각의 객체는 다른 값을 가지고 있을 수 있다.
현재 구현되어있는 MemoryMemberRepository를 보면 Map storee가 static으로 선언되어있는 것을 알 수 있다. static으로 되어있기 때문에 문제가 없지만, static을 빼는 순간 문제가 발생한다!
publicclassMemoryMemberRepositoryimplementsMemberRepository{privatestaticMap<Long,Member> store =newHashMap<>();//(참고 : 현업=>공유되는변수일 경우 concurrenthashmap을 써야함)privatestaticlong sequence =0L;//sequence는 0/1/2 키값 생성하주는 애. 이또한 마찬가지로 현업에서는 동시성 문제로 autumnLong으로 해줘야함. @OverridepublicMembersave(Member member) {member.setId(++sequence);store.put(member.getId(),member);//맵에 저장.return member;//저장된 결과 반환. }
그래서 같은 객체에 대해 테스트를 수행하기 위해 MemberService 코드를 아래와 같이 수정한다.
기존에 new로 생성했던 객체를 constructor를 이용해서 외부에서 객체를 생성해서 넣어주는 것을 Dependency Injection(DI)라고 한다!
publicclassMemberService {//private final MemberRepository memberRepository = new MemoryMemberRepository();privatefinalMemberRepository memberRepository;publicMemberService(MemberRepository memberRepository) {this.memberRepository= memberRepository; }
또한, 순서나 의존관계를 피하기 위해 BeforeEach, AfterEach 어노테이션도 추가해준다!
BeforeEach : 코드가 실행되기전에 수행한다. MemoryMemberRepository 객체를 생성해서 memberService에 넣어준다!
@BeforeEachpublicvoidbeforeEach(){//동작하기 전에 넣어준다!//memberRepository 객체를 생성해서 memberService 객체에 넣어준다!//이렇게 하면 같은 MemoryMemberRepository 객체가 사용된다! memberRepository =newMemoryMemberRepository(); memberService =newMemberService(memberRepository); } @AfterEach//메서드 실행이 끝날 때마다 동작한다. save() 끝나고 afterEach(), findByName() 끝나고 afterEach(), findAll() 끝나고 afterEach()publicvoidafterEach(){memberRepository.clearStore(); }