danDevlog

[Spring Boot] 회원 관리 예제 - 회원 리포지토리 테스트 케이스 작성 본문

Spring 입문

[Spring Boot] 회원 관리 예제 - 회원 리포지토리 테스트 케이스 작성

단데기이 2022. 3. 22. 21:42
728x90

기존에 내가 해오던 검증 방법은 main메소드를 실행해서 메소드에 여러 변수를 넣어봐서

잘 되면 넘어가는 그런 식으로 테스트를 해보았다.

 

하지만 이런 경우는 테스트 해야하는 양이 많아지면 실행하기가 어려워진다.

따라서 테스트 케이스를 작성하고 테스트 코드를 실행하여 동작을 검증해야한다.

 

인텔리제이에서는 따로 test 패키지 에서 테스트 검증을 할 수 있다.

MemoryMemberRepository를 검증하기 위하여 test 내부에 repository 패키지를 만들고 

MemoryMemberRepositoryTest 클래스를 생성한다.  JUnit 테스트 도구를 이용하여 테스트 한다.

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

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
//        Assertions.assertEquals(member, result);
        assertThat(member).isEqualTo(result);
    }

@Test 어노테이션을 메소드 위에 선언하면 해당 메소드를 테스트 대상으로 지정할 수 있다.

assertions.assertEquals(expected, actual) 메소드는 expected와 actual이 같으면 테스트를 통과시킨다.

더 쉬운 방법으로는 assertThat(member).isEqualTo(result); 로 같은 결과가 나온다.

 

위 테스트를 통해 member와 db에 저장되어 있는 result가 같으면 테스트를 통과한다.

테스트를 통과하면 체크 표시가 생긴다.

만약 새로운 member를 생성하고 그 id로 테스트를 해보면 사진과 같이 오류가 발생한다.

 

 

findByName과 findAll

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

        assertThat(result).isEqualTo(member1);
    }

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

위 코드들 모두 개별 테스트로 실행을 하면 통과하지만, 클래스 단위로 테스트를 실행하면 테스트가 통과되지 않는다.

이유는 테스트가 실행되는 순서가 보장되지 않기 때문이다. 위에서 findAll()이 첫 번째로 실행되었는데 이 메서드에서

이미 member1 과 member2 가 생성되어 리포지토리에 save 되었기 때문에 오류가 발생한다.

때문에 해결하기 위하여 하나의 테스트가 종료될 때마다 리포지토리를 초기화 시켜줘야한다.

    @AfterEach
    // 하나의 메소드가 끝날때마다 공용 데이터들을 초기화시켜줘야 한다.
    // AfterEach를 사용하면 Test클래스에 있는 모든 메소드들이 각각 끝나고나서 해당 메소드를 실행한다.
    public void afterEach(){
    	// clearStore() 함수를 따로 만들어줘야함.
        repository.clearStore();
    }

AfterEach어노테이션을 이용하여 리포지토리를 초기화 시켜준다.

이렇게 초기화를 시켜주는 코드를 추가하면 클래스 단위로 모두 테스트를 해도 통과되는것을 볼 수 있다.

Comments