[스프링 입문] 회원 리포지토리 테스트 케이스 작성

enxnong·2023년 4월 23일
0

Spring

목록 보기
11/26

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

테스트 케이스

작성한 회원 리포지토리 클래스가 정상적으로 작동할까?라는 의문이 들 것이다. 이것을 검증하는 방법인 테스트 케이스를 작성해 볼 것이다. 자바에서는 JUnit이라는 프레임워크로 테스트를 실행해서 코드를 코드로 검증하는 방법을 사용할 것이다.


실행 방법

테스트 코드는 java패키지가 아닌 test패키지 내부에 작성한다. 현재 MemoryMemberRepository 를 테스트할 것이므로 repository패키지를 만들고 그 내부에 MemoryMemberRepositoryTest 클래스를 생성한다.

1) save()

@Test 어노테이션을 작성하면 메소드 옆에 실행 버튼이 나타난다. 테스트하고싶은 메소드를 실행해서 테스트하면 된다.

		@Test
    public void save(){

        // 내가 저장한 것
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        // db에서 꺼낸 것
        Member result = repository.findById(member.getId()).get(); 
				// Optional에서 값을 꺼낼때는 get()을 사용한다.

        // 검증하기 => result와 member가 동일한지 확인
        // Assertions.assertEquals(member, result);
        Assertions.assertThat(member).isEqualTo(result);

        System.out.println("member : " + member.getId() + ", " + member.getName());
        System.out.println("result : " + result.getId() + ", " + result.getName());

    }

Assertions.assertEquals(member, result) 와 Assertions.assertThat(member).isEqualTo(result)는 동일한 방법으로 expected와 actual이 같으면 테스트를 통과시키는 메소드이다. ⇒ 여기서는 테스트 케이스에서 임의로 넣어준 member와, 실제로 db에 저장되어 있는 result의 결과값이 같으면 테스트를 통과하도록 되어있다.

2) findName()

@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();
// Member result = repository.findByName("spring2").get(); => 오류 발생
// 왜? result와 member1을 비교하므로 "spring2"는 member2의 값이기 때문에 오류가 발생한다.
			
    Assertions.assertThat(member1).isEqualTo(result);
}

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이 먼저 실행됐으므로 “spring1,2”가 이미 저장된 상태이다.
그래서 findByName객체가 finaAll에서 이미 저장한 “spring1”이 나와 오류가 발생한 것이다.
이를 해결하기 위해 하나의 테스트가 끝날 때마다 데이터를 지워야된다.


해결 방법

1) MemoryMemberRepository 클래스에 clearStore 메소드를 만든 후 clear코드를 작성한다.

public void clearStore(){
    store.clear(); // 데이터를 비움
}

2) MemoryMemberRepositoryTest 클래스에 @AfterEach 어노테이션을 활용하여 하나의 테스트 메소드가 끝날 때마다 호출되어서 실행하도록 한다.

@AfterEach   // 하나의 메소드가 테스트 종료될 때마다 호출되어서 실행
public void afterEach(){
   repository.clearStore();
   // 호출될 때마다 저장소를 싹 비움 => 실행된 메소드의 순서가 관계없어짐
}

순서 상관없이 테스트를 진행해도 모두 통과되는 것을 확인할 수 있다!

profile
높은 곳을 향해서

0개의 댓글