ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring 완전정복 - 3 / 테스트 코드(Repository)
    Spring(Web) 2022. 4. 19. 19:03

    실제로 처음 해보는 부분이였는데, assert를 이용해 테스트 코드를 작성하고 테스트해보는 부분이 생각보다 재밌었다.

     

    강의에서 기본적으로 계속 강조됐던 부분은

    "어떤 객체든 null이 넘어오는 경우(예외)가 생길 수 있으므로, Optional Wrapper Class를 사용 할것"이다.

     

    기본적으로 42seoul을 할 때는 C언어를 사용하고(if NULL, return NULL등을 이용해 널 처리), 이전에 java를 이용해 개발 할 때에도 그저 컴파일이 안될 때 찾아본 후 null 처리를위해 Optional을 사용한 적은 있었지만, 정확한 이유와 함께 알게된것은 이번이 처음이였다.

     

    예전에 kotlin을 이용해 앱 개발을 했었을 때는 항상 변수 이름 끝에 ?를 붙여 null 체크를 했었던것 같은데..

    아무튼 Optional도 사용하다보니 C 언어보다는 훨씬 편하다는 생각이 항상 든다..

     

    본론으로 넘어와서, 이전에 구현했던 Repository 메소드들(save, findByName, findAll)에대한 테스트 코드를 작성했다.

     

    테스트 코드를 작성 할 때는 3가지 부분으로 나누어 작성하면 좋다.

     

    given, when, then.

    given (어떤 객체나 변수들이 주어지고)

    when (해당 객체나 변수들이 언제)

    then (오류를 발생 시킬 수 있는가? / 테스트 하는 부분)

     

    테스트 코드들은 기본적으로 Test 어노테이션을 이용해 진행되었다. 따로 메인 메소드를 만든 후 테스트 할 필요 없이, 각 메소드들마다 개별적으로 테스트를 진행 할 수 있는 점이 새로웠다.

     

    @Test
    public void save() {
        Member member = new Member();
        member.setName("spring");
        repository.save(member);
    
        Member result;
        result = repository.findById(member.getId()).get();
        assertThat(result).isEqualTo(member);
    }

    이전에 구현했던 save 메소드에대한 테스트 코드이다.

     

    1. 먼저 새로운 member를 저장하기위해, 객체 생성.

    2. 해당 객체의 이름을 "spring"으로 설정한 후, save.

    3. member 객체의 id를 이용해 repository에서 찾아낸 객체가, 실제로 member 객체와 같은지 체크

    와 같은 형식으로 진행된다.

     

    다만 findById 메소드는 코드가 한 줄이기도 하고..(HashMap에서 key(id)를 이용해 객체에 접근)해서 강의에서 따로 테스트를 만들지 않은것 같지만, 추가적으로 해보았다.

     

    Repository 테스트 코드 전체

    package hello.hellospring.repository;
    
    import hello.hellospring.domain.Member;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.Test;
    
    import static org.assertj.core.api.Assertions.*;
    
    class MemoryMemberRepositoryTest {
    
        MemoryMemberRepository repository = new MemoryMemberRepository();
    
        @AfterEach
        public void afterEach() {
            repository.clearStore();
        }
    
        @Test
        public void save() {
            Member member = new Member();
            member.setName("spring");
            repository.save(member);
    
            Member result;
            result = repository.findById(member.getId()).get();
            assertThat(result).isEqualTo(member);
        }
    
        @Test
        public void findByName() {
            Member member = new Member();
            member.setName("spring");
            repository.save(member);
    
            Member member2 = new Member();
            member2.setName("spring1");
            repository.save(member2);
    
            Member result = repository.findByName(member.getName()).get();
            assertThat(result).isEqualTo(member);
        }
    
        @Test
        public void findById() {
            Member member = new Member();
            repository.save(member);
            assertThat(repository.findById(member.getId()).get()).isEqualTo(member);
        }
    
        @Test
        public void findAll() {
            Member member = new Member();
            member.setName("spring");
            repository.save(member);
    
            Member member2 = new Member();
            member2.setName("spring1");
            repository.save(member2);
    
            assertThat(repository.findAll().size()).isEqualTo(2);
        }
    }

    afterEach는, 각 테스트가 진행된 후 실행되는 메소드를 지정하는 어노테이션인데, 이전 테스트에 사용된 객체들이 남아있음으로 인해 다음 테스트에 영향을 줄 수 있으므로 추가했다.

Designed by Tistory.