분명 성공해야 하는 테스트가 실패한다..? feat.Assertions

섭정이·2025년 4월 5일
post-thumbnail

목차

  1. 문제발생
  2. 자료수집
  3. 궁금증
  4. 문제해결
  5. 알게된점

1. 문제발생


    @Test
    @Order(1)
    void save(){
        //given
        Member member = new Member("hello", 20);
        //when
        Member savedMember = memberRepository.save(member);
        //then
        Member findMember = memberRepository.findById(savedMember.getId());

        Assertions.assertThat(findMember).isEqualTo(member);
    }

    @Test
    @Order(2)
    void findAll() {
        //given
        Member member = new Member("hello", 20);
        Member member2 = new Member("hello2", 21);
        Member member3 = new Member("hello2", 22);

        memberRepository.save(member);
        memberRepository.save(member2);
        memberRepository.save(member3);

        //when
        List<Member> result = memberRepository.findAll();

        //then
        Assertions.assertThat(result).hasSize(3);
        Assertions.assertThat(result).contains(member, member2, member3);
    }
}

덩연히 성공할 것이라고 생각하던 테스트가 실패를 했다. 아무리 코드를 봐도 잘못된 부분은 보이지 않아서 일단 오류코드를 확인하러 갔다.

2.자료수집

문제의 오류 코드이다. 3 이 나올거라 예상한 맵의 값들이 4개가 찍혀 나오고 있었다. 난 당연히 각각의 테스트는 독립적으로 실행이 되고 초기화 될것이라고 생각했는데 서로 간섭이 생긴것일까..?

junit 공식문서를 참고했다.
분명 각각의 테스트는 독립적인 공간을 가지고 있는다고 했다 sideeffect 를 피하기위해 라고 명시되어있는데....
그래서 repository 를 다시 천천히 확인 하던중
저장소를 싱글톤으로 설계했었던 것을 발견했다.
싱글톤 사용시 stateless 하게 해야한다는것을 알고있었지만 잠깐 부주의 해서 이런 상황이 발생한것이다.

3.궁금증

테스트 코드는 그럼 싱글톤을 사용하지 않거나 stateless 하게 설계하거나 매 테스트 종료시에 초기화를 직접 해줘야 한다는건데.. 너무 비효율 적일거란 생각이 들었다. 그래서 혹시 그런 기능을 지원하는 부분은 없는지 찾아보았다.

4.문제해결

다시 공식문서를 들어가 확인해 보았다.

@AfterEach 어노테이션을 붙이면 매 테스트마다 알아서 해당 메소드가 실행된다고 적혀있다.
그럼 Map.clear 에 해당 어노테이션을 붙인다면...? 성공할 것 같았다.

과연 성공했을까..?


    @AfterEach
    void clearMapAfterEachTest() {
        memberRepository.clear();
    }

를 추가하고 실행해보았다.


성공..!

5.알게된점

  • 싱글톤 사용시 sideeffect에 주의하자.
  • test코드는 기본적으로 독립적으로 테스트 하지만 공유자원은 제외된다.
  • @AfterEach 어노테이션을 사용하면 매 테스트마다 반복적으로 해당 메소드를 호출할 수 있다.
profile
우직하게

1개의 댓글

comment-user-thumbnail
2025년 4월 9일

@AfterEach 꼭 기억할게요

답글 달기