본문 바로가기

웹개발/Spring

[Spring] 테스트 코드는 순서대로 실행되지 않는다.

Member와 관련된 함수를 테스트하는 코드를 가볍게 작성해보았다.

 

public class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

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

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        assertThat(member).isEqualTo(result);
    }

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

 

음~ 잘 짠 것 같다. 자 이제 테스트를 돌려보자!! 내 생각엔 분명 잘 된다. 

 

??????? 뭐야??? 왜?????

 

근데 에러가 떳다. findByName이 테스트를 통과하지 못했다. 코드를 아무리봐도 이상한 게 없는데??? 

 

이렇게 된 이유는 테스트가 순서대로 실행되지 않기 때문이다. 

 

코드 순서는 

 

save()--> findByName() --> findAll()이지만 테스트가 꼭 그 순서대로 실행되는 건 아니다. 그렇기 때문에 테스트가 끝날 때마다 초기화를 해줘야 한다. 즉, 절대 코드 순서에 의존적이도록 테스트 코드를 짜면 안 된다!!!

public class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach(){
        repository.clear();
    }

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

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        assertThat(member).isEqualTo(result);
    }

    @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("Spring2").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);
    }

 

afterEach를 통해 각 테스트가 끝날 때마다 저장소를 초기화하도록 만들어줬다. 그러면 테스트가 잘 통과될까??

 

 

Clear~