[Spring-입문] 회원 관리 예제 - Test해보기

DANI·2023년 11월 14일

Spring[김영한T]

목록 보기
4/31
post-thumbnail

💻 Test해보기

💾 MemoryMemberRepositoryTest 파일

🔴 save() 메서드 테스트

public class MemoryMemberRepositoryTest {
    MemoryMemberRepository memoryMemberRepository = new MemoryMemberRepository();

    // @Test 어노테이션을 붙여야 Test 메서드인지 앎
    @Test
    public void save(){
        // 객체 생성
        Member member = new Member();
        // 생성된 객체에 이름 저장
        member.setName("홍길동");
        // 레파지토리에 객체 저장
        memoryMemberRepository.save(member);
        // optional에서 값을 꺼낼 땐 get으로 꺼냄, 좋은 방법은 아니나 테스트 코드니 허용
        // 객체에 저장된 id를 불러와서 result 인스턴스로 저장
        Member result = memoryMemberRepository.findById(member.getId()).get();

        // result인스턴스와 member인스턴스가 같은 것인지 확인
        // System.out.println("result = " + (result==member));
        Assertions.assertEquals(member, result);
    }

}

🔵 결과 확인



🔴 findAll() 메서드 테스트

public class MemoryMemberRepositoryTest {
    MemoryMemberRepository memoryMemberRepository = new MemoryMemberRepository();

    @Test
    public void findAll(){
        Member member1 = new Member();
        member1.setName("홍길동1");
        memoryMemberRepository.save(member1);

        Member member2 = new Member();
        member2.setName("홍길동2");
        memoryMemberRepository.save(member2);

        List<Member> result = memoryMemberRepository.findAll();
        assertThat(result.size()).isEqualTo(2);
    }

}

🔵 결과 확인



🔴 findByName() 메서드 테스트

public class MemoryMemberRepositoryTest {
    MemoryMemberRepository memoryMemberRepository = new MemoryMemberRepository();

    @Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("홍길동1");
        memoryMemberRepository.save(member1);

        Member member2 = new Member();
        member2.setName("홍길동2");
        memoryMemberRepository.save(member2);

        Member result = memoryMemberRepository.findByName(member1.getName()).get();
        Assertions.assertEquals(member1, result);

        Optional<Member> result2 = memoryMemberRepository.findByName(member2.getName());
        Member result3 = result2.get();
        assertThat(result3).isEqualTo(member2);
    }

}

🔵 결과 확인




🔍 만약에 세가지 메서드를 한 번에 TEST할 경우?


테스트 파일은 순차적으로 실행되지 않고 쓰레드로 실행이 된다. 따라서 findAll 메서드에서 이미 생성된 인스턴스가 있기때문에 findByName에서 오류가 난다.


💡 해결방안


자원을 반납해준다!


💾 MemoryMemberRepository 파일에 다음의 메서드를 추가한다

public void clearStore() {
        users.clear();
    }

💾 MemoryMemberRepositoryTest 파일에 다음을 추가

@AfterEach
    public void clear(){
        memoryMemberRepository.clearStore();
    }

테스트가 실행된 후 자원을 반납해준다.



정상실행!



이렇게 레파지토리를 만든 후 테스를 해보았지만, 테스트 후에 개발을 하는 경우도 있다. 이것을 TDD라고 한다.



0개의 댓글