문제점
MemberService.java의 memberRepository와 MemberServiceTest.java와 memberRepository가 서로 다른 저장소: 다른 인스턴스(현재는 static 키워드가 Map store 앞에 붙어어있어서 같은 디비로 사용되지만, static이 없으면 다른 디비가 생성되면서 문제 발생)
해결방안
외부에서 넣어주도록 설계: MemoryService에서 직접 new 해서 객체를 생성하지 않음
같은 memoryRepository 사용
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
memberRepository를 직접 new해서 객체를 생성하지 않고 외부에서 넣어주는 것을 Dependency Injection(의존성주입)이라 한다.
@BeforeEach
public void berforeEach() {//테스트가 실행할 때마다 생성
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@Test
void 회원가입() {//join
//given 뭔가 주어졌을 때: 데이터
Member member = new Member();
member.setName("hello");
//when 이게 실행됐을 때: 검증부분
Long saveId = memberService.join(member);
//then 결과가 이렇게 되어야 한다: 검증확인
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void 중복_회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
//방법1
try {
memberService.join(member2);//같은 이름으로 등록이 되면 fail
fail();
} catch (IllegalStateException e) {
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
//방법2
assertThrows(IllegalStateException.class, () -> memberService.join(member2));//member2를 넣으면 앞에 예외가 터져야함: 성공
//방법3
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//then
}