2023. 2. 2. 17:27ㆍSpring 강의/section3
MemberService 코드를 테스트 해보자
MemberService 클래스에서 ctrl + shift + t를 누르면 자동으로 Test 클래스를 만들어준다.
테스트 코드는 given - when -then으로 나누어 작성하면 좋다.
given - 뭔가가 주어졌을 때
when - 이것을 실행하면
then - 결과가 이게 나와야 한다.
join() Test 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Test
void join() {
//given - 뭔가가 주어졌을 때
Member member = new Member();
member.setName("hello");
//when - 이것을 실행하면
Long saveId = memberService.join(member);
//then - 결과가 이게 나와야 한다.
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
|
cs |
결과
회원 가입 시 중복회원이 있는 경우 예외를 발생시키는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Test
public void 중복_회원_예외(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
assertThrows(IllegalStateException.class, () -> memberService.join(member2));
}
|
cs |
assertThrows(첫번째 인자, 두번째 인자)
두번째 인자를 실행시켰을 때 첫번째 인자와 같은 타입의 예외가 발생하는지 검사한다.
테스트 끝나면 그때 그때 비워주자.
1
2
3
4
5
6
|
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@AfterEach
public void afterEach(){
memberRepository.clearStore();
}
|
cs |
그런데 조금 애매한 문제가 있다.
MemberService에서 만든 MemoryMemberRepository 객체와
MemberServiceTest 에서 만든 MemoryMemberRepository 객체가 다르다.
지금이야 MemoryMemberRepository는 static이기 때문에 문제가 없으나
(static - 인스턴스와 상관없이 클래스 레벨에 붙음)
만약 static이 아니었다면 서로 다른 인스턴스라서 다른 db를 사용하며 바로 문제가 생긴다.
이럴 때는 memberRepository를 new 해서 생성하지 말고 외부에서 생성하도록 바꿔준다.
그러면 test 코드에서도 @BeforeEach로 테스트가 동작하기 전에 MemoryMemberRepository를 만들어서 그것을 MemberService에 넣어주면 같은 repository를 사용할 수 있다.
MemberService의 입장에서 보면 직접 new 하지 않고 외부에서 repository를 넣어준다.
이런 것을 Dependencies Injection(DI)이라고 한다.