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

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

junit 공식문서를 참고했다.
분명 각각의 테스트는 독립적인 공간을 가지고 있는다고 했다 sideeffect 를 피하기위해 라고 명시되어있는데....
그래서 repository 를 다시 천천히 확인 하던중
저장소를 싱글톤으로 설계했었던 것을 발견했다.
싱글톤 사용시 stateless 하게 해야한다는것을 알고있었지만 잠깐 부주의 해서 이런 상황이 발생한것이다.
테스트 코드는 그럼 싱글톤을 사용하지 않거나 stateless 하게 설계하거나 매 테스트 종료시에 초기화를 직접 해줘야 한다는건데.. 너무 비효율 적일거란 생각이 들었다. 그래서 혹시 그런 기능을 지원하는 부분은 없는지 찾아보았다.
다시 공식문서를 들어가 확인해 보았다.

@AfterEach 어노테이션을 붙이면 매 테스트마다 알아서 해당 메소드가 실행된다고 적혀있다.
그럼 Map.clear 에 해당 어노테이션을 붙인다면...? 성공할 것 같았다.
@AfterEach
void clearMapAfterEachTest() {
memberRepository.clear();
}
를 추가하고 실행해보았다.

성공..!
@AfterEach 꼭 기억할게요