13강(회원 서비스 클래스 테스트)
편하게 테스트 클래스 만들기
얘를 alt + Enter 해주면
요렇게 테스트 클래스 만들건지 물어본다.
누르면 이렇게 뜨고 데려갈 멤버를 다 체크해주고 오케이.
그럼 간단하게 만들어진다.
테스트는 과감하게 한글로 이름을 바꿔도 된다고 함. 외국인이랑 일하는 거 아닌 이상 한글로도 많이 적음.
이렇게 하면 회원가입에 성공.
그런데 여기서 중요한 것은 정상 플로우(?) 보단 예외 플로우(?)가 중요함.
Join의 핵심은 저장이 되는 것도 중요한데 중복회원검증 로직을 잘 파서 예외가 터트려 지는지도 봐야함.
요기서 저 예외가 잘 터트려지는지가 중요함.
Try catch로 예외를 잡아내는 방법도 있으나 비효율적이다.
assertThrows라는 좋은 문법을 사용해서 예외를 member2를 넣었을 때 익셉션이 터져야 한다.
그런데 member1을 넣었을 때도 익셉션이 터진다. 왜지???(이해가 안됨. 질문)
숙제 : 답변 정리해서 적어보기
이미 memberservice에 등록된 member1의 'spring' 리터럴이 다시 memberservice에 등록되는 꼴이기 때문. member1,2가 문제가 아닌, 이미 등록된 spring이 다시 등록되어 예외가 터지게 되는 것이다
중복 제외를 해주는 부분. 그런데 애매한게 있다. MemerService에 있는 객체와 테스트 서버에 있는 객체가 서로 다르기 때문에 뭔가 애매하다고 한다. 두 개를 따로 쓸 이유가 없음.
지금은 static으로 되어 있기 때문에 문제가 없지만 만약 static이 없으면 서로 다른 DB가 되기 떄문에 문제가 생긴다.(???질문)
같은 리포지토리로 테스트 하는게 맞다.
같은 인스턴스 쓰게 만드는 방법
memberRepository를 직접 new로 생성하는게 아니고 외부에서 넣어주도록 바꾸기.
@BeforeEach: 테스트 메소드 이전에 수행된다.
이렇게 하면 테스트 실행할 때마다 각각 생성을 해준다.(독립적으로 실행 되어야하기 때문)
memoryMemberRepository를 만들고 얘를 위에 넣어 놓음. 그럼 얘를 memberService에서 memberRepository를 넣어준다.
그럼 같은 memoryMemberRepository가 사용이 된다.(이해 잘 안됨..질문)
MemberService 입장에서 직접 new 하지 않고 외부에서 memberRepository를 넣어준다. 이런걸 dependency injection(의존관계 주입)이라고 한다.