[3-3] 회원 리포지토리 테스트 케이스 작성

ohun·2022년 5월 16일
0

Spring 입문

목록 보기
9/16

MemoryMemberRepositoryTest

test.java.hello.hellospring.repository 아래에 테스트 클래스를 생성한다.

```java
package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Optional;

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {

    MemberRepository repository = new MemoryMemberRepository();

    @Test
    public void save() {
        Member member = new Member();
        //  spring 이라는 이름으로 정보 저장
        member.setName("spring");

        //  id 저장
        repository.save(member);

        //  id 꺼내기
        //  Optional<Member> result = repository.findById(member.getId());
        Member result = repository.findById(member.getId()).get();  //  get() 을 쓰면 Optional 을 까서 꺼낼 수 있음

        //  result 와 member 값 비교
        //  System.out.println("result = " + (result == member));
        //  Assertions.assertEquals(member, result);    // junit 버전_Assertions.assertEquals(expected_기대값, actual_실제값) : 일치 여부 검증
        assertThat(member).isEqualTo(result);    //  assertj 버전, [Option]+[Enter] 에서 static 으로 assertThat 만 쳐서 사용 가능
    }

    @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();

        // result(spring1) == member1
        assertThat(result).isEqualTo(member1);
    }

    @Test
    public void findAll() {
        //  정보 2개 저장
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

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

        //  원래 반환 타입인 List 형태로 result 저장
        List<Member> result = repository.findAll();

        assertThat(result.size()).isEqualTo(2);
    }
}
```
  • 일치 여부 검증
    • (Assertions_junit 버전) 만약 Assertions.assertEquals(expected, actual) 에서 expected ≠ actual 라면 save 를 Run 했을 때 아래와 같이 X 표시가 뜰 것
    • (Assertions_assertj 버전) 마찬가지~
  • 각 메소드 별 검증을 끝내고 class 단위 검증을 시도하면?

    사진과 같이 findByName() 메소드에서 검증 실패함! 값은 맞게 넣어놨는데, why?
    검증 순서를 보면 findAll() 메소드가 가장 먼저 실행됨. 따라서 데이터가 이미 저장된 것이 존재.
    테스트는 메소드 순서와 상관 없이, 의존관계 없이 동작해야 함!
    어떻게? 테스트 하나 끝날 때마다 저장소나 공용 데이터를 clear 해줘야 한다!
        ```java
        package hello.hellospring.repository;
        
        import hello.hellospring.domain.Member;
        
        import java.util.*;
        
        public class MemoryMemberRepository implements MemberRepository{
        
            private static Map<Long, Member> store = new HashMap<>();
            private static long sequence = 0L;
        
            @Override
            public Member save(Member member) {
                member.setId(++sequence);
                store.put(member.getId(), member);
                return member;
            }
        
            @Override
            public Optional<Member> findById(Long id) {
                return Optional.ofNullable(store.get(id));
            }
        
            @Override
            public Optional<Member> findByName(String name) {
                return store.values().stream()      // stream(): Java8 부터 지원, 컬렉션과 배열 등 저장된 요소들을 하나씩 참조하며 반복적인 처리 가능. 불필요한 for문 필요X
                        .filter(member -> member.getName().equals(name))    //  람다 사용, member 에서 name 을 가져와서 입력된 name과 비교
                        .findAny();     //  하나라도 찾으면 return
            }
        
            @Override
            public List<Member> findAll() {
                return new ArrayList<>(store.values()); //  member 는 Map 인데 반환값 List임. 걍 ㄱㄱ.
            }
        
            public void clearStore() {
                store.clear();
            }
        }
        ```
        
    • clearStore() 메소드 추가해줌. 데이터 클리어해줌.
      package hello.hellospring.repository;
      
      import hello.hellospring.domain.Member;
      import org.assertj.core.api.Assertions;
      import org.junit.jupiter.api.AfterAll;
      import org.junit.jupiter.api.AfterEach;
      import org.junit.jupiter.api.Test;
      
      import java.util.List;
      import java.util.Optional;
      
      import static org.assertj.core.api.Assertions.*;
      
      class MemoryMemberRepositoryTest {
      
          MemoryMemberRepository repository = new MemoryMemberRepository();   // MemoryMemberRepository 만 테스트 하니까 인터페이스 말고 해당으로 바꿔줌
      
          @AfterEach
          public void afterEach() {
              repository.clearStore();
          }
      
          @Test
          public void save() {
              Member member = new Member();
              //  spring 이라는 이름으로 정보 저장
              member.setName("spring");
      
              //  id 저장
              repository.save(member);
      
              //  id 꺼내기
              //  Optional<Member> result = repository.findById(member.getId());
              Member result = repository.findById(member.getId()).get();  //  get() 을 쓰면 Optional 을 까서 꺼낼 수 있음
      
              //  result 와 member 값 비교
              //  System.out.println("result = " + (result == member));
              //  Assertions.assertEquals(member, result);    // junit 버전_Assertions.assertEquals(expected_기대값, actual_실제값) : 일치 여부 검증
              assertThat(member).isEqualTo(result);    //  assertj 버전, [Option]+[Enter] 에서 static 으로 assertThat 만 쳐서 사용 가능
          }
      
          @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();
      
              // result(spring1) == member1
              assertThat(result).isEqualTo(member1);
          }
      
          @Test
          public void findAll() {
              //  정보 2개 저장
              Member member1 = new Member();
              member1.setName("spring1");
              repository.save(member1);
      
              Member member2 = new Member();
              member2.setName("spring2");
              repository.save(member2);
      
              //  원래 반환 타입인 List 형태로 result 저장
              List<Member> result = repository.findAll();
      
              assertThat(result.size()).isEqualTo(2);
          }
      }
      • afterEach() : 각 메소드마다 해당 기능(repository.clearStore()) 실행
profile
공부 중입니다.

0개의 댓글