회원서비스 테스트
저번에 만든 회원서비스 클래스를 테스트 해보자.
테스트하는 간단한 방법을 하나 소개해주겠다. 단축키는 ctrl+shft+t이다.
저번에 만든 서비스클래스를 클릭하면 누르면 이렇게 뜬다.
이러면 껍데기를 알아서 만들어준다.
package hello.hellospring.service;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
@Test
void join() {
}
@Test
void findMembers() {
}
@Test
void findOne() {
}
}
테스트 코드는 이름을 과감하게 한글로 바꿔도 좋다. 영어권 사람들과 일하는게 아니라면! 빌드될때 테스트코드는 제외되기때문에 괜찮다.
이제 join()메서드부터 테스트 코드를 짜보자. 여기서 하나 추천하는게 있다. 아래를 보자.
void 회원가입() {
//given
//when
//then
}
given, when, then패턴이다.
테스트코드는 보통 먼저 주어진 것(given), 그리고 이게 실행될 환경(when), 그리고 결과로 나와야 하는 것(then)으로 구분될 수 있다. 테스트가 커지면 when만 보면 무엇을 검증하는지, given은 주어진 데이터가 무엇인지, then을 보면 무엇이 원하는 결과인지를 바로 알 수 있다. 이 패턴에 익숙해지자.
@Test
void 회원가입() {
//given
Member member = new Member();
member.setName("hyeonjin");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
Assertions.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);
try {
memberService.join(member2);
fail("예외가 발생해야 합니다.");
} catch(IllegalStateException e) {}
//then
}
핵심은 try-catch문이다. member1과 member2에 같은 이름을 저장하고, join()을 실행했을때 정상적인 코드라면 예외가 발생해야 한다. 즉 catch문에 걸려서 끝나야 한다. 그런데 만약 예외가 발생하지 않는다면? 그럴때는 다름 호출차례인 fail()문으로 무조건 테스트가 실패하게끔 만들어야 한다. 왜냐하면 실패했으니까! fail()문은 테스트를 강제로 실패하게 된다.