[Spring] 회원 리포지토리 테스트 케이스 작성해보기

Haeun Noh·2023년 8월 15일
1

TweeksStudy:1 (Spring)

목록 보기
9/13
post-thumbnail

0815


1. 기존의 검증 방법

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

하지만 이러한 방법은

  • 준비하고 실행하는데 오래 걸림
  • 반복 실행하기 어려움
  • 여러 테스트를 한 번에 실행하기 어려움

따라서! 자바는 JUnit 이라는 프레임워크로 테스트 코드 자체를 실행해서 이러한 문제를 해결한다.


2. 회원 리포지토리 메모리 구현체 테스트

  • src/test/java 하위 폴더에 생성한다.

2.1. save() 테스트 케이스

  • 값이 잘 저장되는지를 테스트
class MemoryRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

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

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        System.out.println("result = "+(result == member));
//        Assertions.assertEquals(member, result);
        Assertions.assertThat(member).isEqualTo(result);

    }
    ...
}
  • 테스트 클래스는 다른 곳에서 가져다 쓸 용도가 아니기 때문에 public을 굳이 사용하지 않아도 된다.

  • Assertions : 매번 일일이 출력하는 것이 아니라 Assertions의 assertThat()을 이용하여 해당 기능이 잘 작동하는지를 알아본다.

    • org.assertj.core.api.Assertions

2.2. findByName() 테스트 케이스

  • 저장된 name을 잘 찾을 수 있는지를 테스트
    @Test
    public void findByName() {
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

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

        Member result = repository.findByName("spring1").get();
        Assertions.assertThat(result).isEqualTo(member1);
    }

2.3. findAll()

  • 전체 데이터가 잘 조회되는지를 테스트
    @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();
        Assertions.assertThat(result.size()).isEqualTo(2);
    }

그런데! findAll()까지 만들고 나니 에러가 발생했다. 왜일까?


2.4. findAll()을 추가한 뒤 발생한 에러의 원인

  • findAll()이 먼저 실행됨
    • spring1과 spring2가 먼저 저장이 되었기 때문에 이미 있는 값이 에러를 발생시킨 것

2.5. 해결 방법

AfterEach를 사용하자!

  • AfterEach : afterEach()를 만들어 store를 한 메서드 테스트가 끝날 때마다 clear를 해주어 위와 같은 에러의 발생을 막는다.

  • 순서와 관계없이 설계가 되어야 한다.

  • 때문에 공용 데이터와 같은 것들은 테스트가 끝나면 깨끗하게 지워주어야 한다.


3. 테스트 코드의 장점

  • 클래스 단위 또는 테스트 코드 전체를 한꺼번에 실행할 수 있다!
  • 발생할 가능성이 있는 예외에 대한 대처를 할 수 있다.

4. 테스트 주도 개발 - TDD

테스트를 먼저 만들고 구현 클래스를 만드는 것



profile
Tistory로 옮기게 되었습니다. @haeunnohh

0개의 댓글