[회원 관리 예제 - 백엔드 개발] 회원 서비스 테스트
회원 서비스 테스트
MemberService에 커서를 위치 시킨 후, ctrl + shift + T > Create New Test... > 3가지 메소드 선택 후 OK 클릭 >
MemberServiceTest 생성
1. 회원가입 테스트
MemberService memberService = new MemberService();
@Test
void 회원가입() {
// 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());
}
결과
정상
2. 중복 회원 예외 테스트
@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();
// } catch (IllegalStateException e) {
// assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// }
// memberService.join(member2)를 실행하면 IllegalStateException이 생길거야 라는 의미
// 2
// assertThrows(IllegalStateException.class, () -> memberService.join(member2));
// 3
// assertThrows(NullPointerException.class, () -> memberService.join(member2));
// 메세지도 검증
// 4
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
1번 결과 : 정상
"이미 존재하는 회원입니다."를 "이미 존재하는 회원입니다.123"으로 수정하면 아래와 같이 에러
2번 결과 : 정상
memberService.join(member2)의 결과가 IllegalStateException 면 정상으로 나온다.
3번 결과 : 에러
memberService.join(member2)의 결과가 NullPointerException이 아닌 IllegalStateException이므로 에러
4번 결과 : 정상
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); 를 사용하여 메세지도 검증
회원가입 테스트에서 member.setName("spring"); 으로 수정하고 전체 실행하면
"회원 리포지토리 테스트 케이스 작성"때와 마찬가지로 에러 발생하므로 아래 코드를 추가한다.
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
최종 코드
class MemberServiceTest {
MemberService memberService = new MemberService();
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
@Test
void 회원가입() {
// given
Member member = new Member();
member.setName("spring");
// 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);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}
하지만 여기서도 한가지 문제점이 있다.
MemberService 안에도 MemoryMemberRepository가 있고
MemberServiceTest 안에도 MemoryMemberRepository가 있다.
같은 MemoryMemberRepository 값을 사용해야 하는데 다른 MemoryMemberRepository 값을 사용 중이다.
(엄밀히 따지면 현재 MemoryMemberRepository는 static값을 사용 중이여서 문제 없지만 static이 아닌 경우에 문제가 된다.)
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
class MemberServiceTest {
MemberService memberService = new MemberService();
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
MemberService를 아래와 같이 수정
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
MemberServiceTest를 아래와 같이 수정
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
...
MemberService 입장에서 직접 new 하지 않고 외부에서 넣어준다.
이것을 의존성 주입(dependency injection)이라고 한다.
인프런 강의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"을 정리한 것 입니다.
[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세
www.inflearn.com