개발/Spring

[Spring] 스프링 입문 - (회원 관리 예제) 회원 리포지토리 테스트 케이스

y_lime 2024. 11. 7. 15:57

테스트 케이스란 ?

개발한 기능을 실행해서 테스트 할 때 자바와 main 메서드를 통해서 실행 or 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행

  • 준비하고 실행하는데 오래 걸리고, 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점을 자바의 JUnit이라는 프레임워크로 테스트를 실행하여 해결 가능

아래와 같이 해당 위치에 repository 패키지를 만들어준다.

이때 class 이름은 test하려는 repository 이름 뒤에 "Test"를 붙여준다.

 

테스트 케이스 만들기

@Test 어노테이션을 사용하여 검증 가능!

class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @Test
    public void save() {
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        // return type이 optional이기 때문에 get()으롤 꺼내온다.
        Member result = repository.findById(member.getId()).get();
        // 검증 단계
        // System.out.println("result =" + (result == member));
        Assertions.assertEquals(member, result);
        // 출력되는 것은 없지만, 초록 불이 뜨면 expected와 actual이 같다는 뜻!
    }
}

 

검증 방법 1) Assertions.assertEquals({기대값}, {실제값});

 

검증 방법 2) Assertions.assertThat({기대값}).isEqualTo({실제값})

  1. 여기에서 Assertions는 assertj 라이브러리를 사용
  • 이 또한,@Assertions.assertEquals({기대값}, {실제값});과 같이 
    • 기대했던 값이랑 같으면 테스트 성공
    • 만약 실제값에 null을 넣으면, 기대했던 값과 다르게 되므로 테스트가 실패
  • 만약 import static org.assertj.core.api.Assertions.*;을 추가해주면 아래와 같이 Assertions.는 생략 가능
 assertThat(member).isEqualTo(result);

 

 

이름으로 찾기

@Test
public void findByName(){
    Member member1 = new Member();
    member1.setName("spring1");
    repository.save(member1);

    Member member2 = new Member();
    member2.setName("spring2");
    repository.save(member2);
    //option + command + V 단축키
    Member result = repository.findByName("spring2").get();
    assertThat(result).isEqualTo(member1);
}

🍯꿀팁🍯

  • 복붙해서 여러 member을 만들어야할 경우, member에서 fn + shitf + f6를 누르고 rename 하면 하나하나 수정하지 않고 전체적으로 rename을 해준다.
Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
  • spring1 == member1 이므로 테스트 성공 !
Member result = repository.findByName("spring2").get();
assertThat(result).isEqualTo(member1);

 

  • spring2 != member1 (spring2 는 memebr2) 이므로 테스트 실패 !

전체 리스트로 찾기

@Test
public void findAll(){
    Member member1 = new Member();
    member1.setName("spring1");
    repository.save(member1);

    Member member2 = new Member();
    member2.setName("spring2");
    repository.save(member2);

    List<Member> result = repository.findAll();

    assertThat(result.size()).isEqualTo(2);

}

 

이제 다 만들었으니 class 에서 실행을 해주자 !

에러 발생 !!!!

  • save(), findByName(), findAll() 각각 돌리면 테스트 성공을 하지만,
  • class 전체를 실행하면 아래와 같은 에러가 발생한다.

왜 에러가 발생할까 ??

왼쪽 실행 순서를 확인하면, findAll() → findByName() → save() 순으로 실행이 되는것을 볼 수 있다.

  • 테스트의 순서는 보장이 안되니, 테스트 메서드가 각각 순서에 영향 받지 않도록 해야한다.
  • findAll() 부분에서 이미 객체 "member1" 과 "member2"를 이미 save해버려서 findByName()에서는 다른 객체를 불러오게 됨 !! ⟹ error

해결 방법 

:  test가 끝날 때 마다 repository가 깔끔하게 지워지는 코드가 필요 !!

 

1. MemoryMemberRespository에 clearStore 함수 생성

public void clearStore() {
        store.clear();
    }

 

2. @AfterEach 어노테이션 사용!

class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach() {
        repository.clearStore();
    }

 

test가 서로의 의존 관계 없이 설계되어 실행 됨 

해결 완료 !!

 


@참고자료

[인프런] 김영한 - 스프링 입문 강의 (무료)