회원 서비스 개발에 이어, 개발한 회원 서비스를 테스트할 차례다.
테스트를 수행할 MemberService에서, Ctrl + Shift + T를 누르고, Create New Test를 누른다.
그러면 이런 창이 뜬다. 테스트 클래스 이름도 본래 클래스 이름에 Test만 붙여서 자동으로 작성해 준다.
내가 테스트하고 싶은 메소드를 아래에서 체크해서 OK를 누른다.
그러면 이렇게 테스트에 필요한 틀을, 적절한 위치(경로)에 아주 쉽게 만들어준다.
일단 만들어진 테스트가 문제가 없는지, 현재 상태에서 바로 한번 돌려본다.
다행히 문제는 없다.
본격적으로 테스트 케이스를 작성해 보기 전에, 잠깐 MemberService로 가보자.
기존 코드를 변경해서, 이렇게 생성자를 통해 외부에서 리포지토리를 주입받도록 변경한다.
( 이렇게 직접 new로 객체를 생성하지 않고 외부에서 주입받는 걸 "의존성 주입( Dependency Injection, DI)" 이라고 한다. )
기존 코드는 MemberService에서 직접 new를 통해 리포지토리 객체를 만드는 코드였다.
그런데 그렇게 하면, MemoryMemberRepository와 MemberService가 각각 다른 DB를 사용하게 된다.
물론, 지금 현 상태로는 위 코드처럼 DB가 static으로 생성되어 있기 때문에 문제가 없지만, 만약 static이 아니라면?
각 클래스마다 DB 객체를 따로 생성하기 때문에 MemoryMemberRepository와 MemberService는 같은 DB를 공유하지 않게 될 수 있고, 충분히 문제가 발생할 수 있다.
따라서 아래처럼 해야 한다.
16행에서 MemoryMemberRepository로 DB를 생성하고,
17행에서는 생성한 DB를 그대로 MemberService의 생성자를 통해 주입해준다.
@BeforeEach 어노테이션은, 각 테스트 메소드가 실행되기 전마다 해당 메소드를 실행시킨다는 뜻이다.
MemoryMemberRepository(DB생성) -> MemberService(DB 주입받음) -> MemberServiceTest(앞의 두개를 사용)
이런 틀이라고 보면 되겠다.
이렇게 하면 같은 DB를 공유할 수 있게 된다.
회원가입 검증 코드이다. ( 기존 join 메소드의 이름을 바꿨다. 테스트 코드이니 한글로 작성해도 상관없다. )
given, when, then은 각각 -> given이 주어지고, when의 행위를 하였을 때, then을 검증한다. 라는 뜻이다.
꼭 해야 할 필요는 없지만, 코드가 길어지고 복잡해졌을 때 이렇게 구분해두면 가독성이 좋아진다.
given에선 hello 라는 name을 가진 member 객체를 생성하고,
when에선 join 메소드로 member 객체를 회원가입 시켰다. 그리고 반환된 회원 ID를 saveId 변수에 에 저장했다.
then에선, savdId를 기준으로 리포지토리에서 회원을 찾는다. ( 방금 저장된 회원을 찾음 )
마지막으로 내가 회원가입 시킨 객체와 방금 리포지토리에서 찾은 객체의 name을 비교하여 검증한다.
테스트를 돌려보면, 문제가 없는것을 확인할 수 있다.
그러나 이것은 반쪽짜리 테스트다.
MemberService에서는 중복회원 검증 메소드까지 만들어 두었었다. 그것도 테스트해야 한다.
같은 이름(spring)을 가진 member1, member2를 만든 후, member1을 가입시킨다.
그리고 47행에서 assertThrows 메소드를 이용해, member2를 가입시켰을 경우 예외가 잘 발생하는지 확인한다.
그리고 출력된 예외를 변수 e에 저장한다.
마지막으로 assertThat 메소드로 e 메시지와 "이미 존재하는 회원입니다." 메시지가 같은지 검증한다.
우리는 MemberService에서 중복 회원일 경우 IllegalStateException 예외와 함께 "이미 존재하는 회원입니다." 메시지를 출력하게 만들었기 때문이다.
테스트를 돌려보면, 역시 문제 없다.
이제 전부 테스트한것 같지만, 아직 할 일이 남았다. 각 테스트가 끝날 때마다 DB를 초기화시키는 작업이다.
매번 초기화시키지 않으면 데이터가 겹쳐서 테스트가 제대로 수행되지 않을 수 있다.
MemoryMemberRepositoryTest에서 사용했던 afterEach() 메소드를 가져오자.
MemberServiceTest에 그대로 붙여넣어 준다.
그리고 객체변수명만 repository -> memberRepository로 살짝 바꿔준다.
이제 전체 테스트를 돌려보면?
성공적으로 테스트가 완료되었다.
아래는 완성된 MemberServiceTest 코드다.
이렇게 성공적으로 회원 서비스 테스트를 작성하고 돌려볼 수 있었다.
'Development > Spring' 카테고리의 다른 글
스프링 입문 - 회원 서비스 개발 (0) | 2023.11.07 |
---|---|
스프링 입문 - 회원 리포지토리 테스트 케이스 작성 (0) | 2023.11.01 |
스프링 입문 - 회원 도메인과 리포지토리 만들기 (2) | 2023.10.29 |
스프링 입문 - 비즈니스 요구사항 정리 (0) | 2023.10.29 |
스프링 입문 - API (0) | 2023.10.26 |