회원관리프로그램 - 리포지토리 테스트 케이스
이제 구현한 리포지토리에 함수들이 잘 동작하는지 살펴보기위해 테스트를 진행하겠습니다.
test모듈 안에 repository라는 패키지를 만들고 그 안에 MemoryMemberRepositoryTest라는 java class를 생성해 테스트를 진행해 보도록 하겠습니다!
각각의 함수들(save, findByName, findAll)을 체크해보기 위해 테스트 케이스를 작성하면 되는데요. 테스트 케이스를 작성할 때는 given(어떤상황에서), when(~일 때), then(~이어야한다)으로 기준을 나누면 좋습니다.
public class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
// 모든 test가 끝날 때 마다 실행
// 각각의 test가 의존적이지 않게 clear
@AfterEach
public void afterEach(){
repository.clearStore();
}
@Test
public void save(){
//given
Member member = new Member();
member.setName("spring");
//when
repository.save(member);
//then
Member result = repository.findById(member.getId()).get();
assertThat(result).isEqualTo(member);
}
@Test
public void findByName() {
// given
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
// shift+f6 이름 한번에 바꾸기
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
// when
Member result = repository.findByName("spring1").get();
// then
assertThat(result).isEqualTo(member1);
}
@Test
public void findAll(){
//given
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
//when
List<Member> result = repository.findAll();
//then
assertThat(result.size()).isEqualTo(2);
}
}
순서 독립적인 test 작성
지금 이 상태에서 @AfterEach를 빼고 전체 test를 run하면 findByName에서 아래와 같이 에러가 나고 나머지는 테스트를 통과합니다
이유는 findAll이 먼저 돌아가면서 회원이 2명 추가되고 findByName이 그 다음에 돌아가면서 동명이인 2명을 또 추가했기때문에 *찾는 spring1과 다른 객체가 나온 것입니다.
따라서 모든 테스트 케이스들은 순서에 독립적으로 작성되어야하기 때문에 @AfterEach를 붙여서 매번 test가 끝나면 store을 clear해줍니다
테스트 결과
이제 마지막으로 @AfterEach까지 넣어서 테스트를 돌려보면(테스트 클래스를 run하면 전체 테스트 진행) 모두 통과된 것을 확인할 수 있습니다