이제 만든 회원 서비스를 테스트해보자.
Intellij에 들어가서 만들어준 MemberService 클래스에 들어가서 ctrl+shift+T 를 누르면 새 테스트 생성하기라는 버튼이 나온다. 이를 클릭하면
위와 같은 화면이 나오고, 라이브러리 테스트 항목은 JUnit5로 해주고, 아래의 테스트 메서드 생성 칸에 모두 체크해준 뒤 확인을 누른다.
그러면 위와 같이 자동으로 MemberServiceTest 라는 클래스가 생성되는 것을 확인할 수 있다.
MemberService memberService=new MemberService();
우선 위와 같이 MemberServiceTest 클래스에 memberService라는 MemberService 객체를 만들어주자.
먼저 MemberService의 join 메소드가 잘 동작하는지 알아보자.
위와 같은 코드를 작성해주자.
우선 member라는 Member객체를 하나 만들고, name을 hello로 설정해준다.
그 후 MemberService클래스에 만들어놓은 join 메소드를 통해 member의 id를 saveId에 저장하고, 역시 만들어 놓은 findOne 메소드에 saveId를 매개변수로 넣어서 이 id를 같고 있는 Member 객체를 findMember에 저장한다(결국 findMember는 member와 같다).
그 후 Assertions와 isEqualTo 문법을 통해 만약 member의 name과 findMember의 name 이 같은지 확인하고 있다.
이 Test를 돌려보면
위와 같이 Test가 무사히 끝난 것을 확인할 수 있다.
이제 join 메소드의 중복 회원 가입 방지 서비스가 잘 동작하는지 알아볼 차례이다.
위와 같은 코드를 작성해주자.
Member 객체 member1 과 member2를 만들어 주고, 두 객체의 name을 spring으로 동일하게 설정해준다.
그 후 MemberService클래스에 만들어놓은 join 메소드를 통해 member1을 store에 저장한 뒤 try, catch문을 작성한다.
try문 안에는 member2를 join 메소드를 통해 store에 넣어주는 데, 이 때 store에 이미 같은 name을 가진 member1이 존재하므로 member2는 store에 저장되면 안된다.
만약 try문이 끝까지 실행되면 이름이 중복되는 회원은 가입이 안된다는 로직이 실행되지 않은 것이므로 fail 함수를 호출해주고, 만약 catch문에서 e.Message() 의 값이 MemberService 클래스에서 설정해놓은 "이미 존재하는 회원입니다." 와 같다면 중복 방지 로직이 실행 된 것이다.
Test를 돌려보면
위와 같이 Test가 무사히 끝난 것을 확인할 수 있다.
Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.123");
만약 위와 같이 e.getMessage의 값과 isEqualTo 안의 문장이 달라서 중복 회원을 배제하지 못한다면
위와 같이 Test Error가 뜨게된다!
IllegalStateException e= org.junit.jupiter.api.Assertions.assertThrows(
IllegalStateException.class, ()-> memberService.join(member2)
);
Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
참고로 try, catch문을 위의 코드로 바꾸어도 정상 동작한다.
이제 전에 이미 보았듯이 우리는 각 Test가 끝나면 store을 clear 해줘야한다.
전과 마찬가지로 MemoryMemberRepository 객체를 만든 후, MemoryMemberRepository에서 만들어 주었던 afterEach 메소드를 @AfterEach를 활용하여 각 테스트가 끝난 뒤 실행되게 만들어준다.
그런데 현재 MemberService 와 MemberServiceTest에서 각각 new MemoryMemberRepository(); 를 통해 객체를 만들어주고 있는데, 그러면 각 클래스는 서로 다른 repository를 가지고 코드를 진행하는 것이다. 이는 좋은 방법이 아니다.
private final MemberRepository memberRepository = new MemoryMemberRepository();
MemberService의 위 코드를
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository=memberRepository;
}
위와 같이 바꿔주고
MemberService memberService=new MemberService();
MemoryMemberRepository memberRepository=new MemoryMemberRepository();
MemberServiceTest의 위 코드를
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach(){
memberRepository=new MemoryMemberRepository();
memberService=new MemberService(memberRepository);
}
위의 코드로 바꿔준다.
MemberServiceTest에서 @BeforeEach를 통해 각 Test 전에 memberRepository라는 객체를 만들어서 이를 MemberService 생성자의 매개변수로 넘기고, MemberService에서는 이 memberRepository를 그대로 사용하게 된다.
이를 Dependency Injection(DI) 라고 한다.
'BackEnd > Spring Boot' 카테고리의 다른 글
자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.10.18 |
---|---|
컴포넌트 스캔 & Autowired 통한 스프링 빈 등록 (2) | 2022.10.13 |
회원 Service 만들기 (0) | 2022.10.11 |
회원 Repository 테스트 케이스 작성하기 (2) | 2022.10.08 |
회원 Domain과 Repository 만들기 (0) | 2022.10.07 |