스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
그냥 질문 글 정리
테스트를 위한 객체를 생성하고 각 테스트를 할 때 마다 memoryRepository를 clear해주면 된다고 생각을 했다.
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
MemberService memberService = new MemberService(memberRepository);
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
그런데 강의 코드는 테스트 시작 전 마다 계속 새로운 객체를 생성해주는 방식을 사용했다.
내 생각에는 메모리 낭비인 것 같은데 왜 단순 clearStore()가 아니라 새로 생성을 해주는 걸까!!!!
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
질문게시판에 이미 답변 완료된 질문이 있었드아
답변
MemoryMemberRepository에 있는 store가 static으로 선언되어 있기 때문에 MemoryMemberRepository 객체를 삭제하고 다시 만들어도 초기화 되지 않고 남아있습니다. 따라서 clearStore()를 호출해서 데이터를 직접 삭제해주어야 합니다^^
그리고 JUnit은 각각의 테스트 메서드 마다 테스트 자체를 다시 만들어버립니다. 따라서 작성한 코드도 각각의 테스트 마다 매번 새로운 객체가 생성됩니다. 사실상 @BeforeEach와 똑같은 것이지요. (직접 주소값을 찍어보시면 확인할 수 있습니다.)
따라서 둘중 아무것이나 사용해도 됩니다^^ 단순하면 필드에서 직접 처리해도 되고, 초기화가 복잡해지면 @BeforeEach를 사용하면 됩니다.
감사합니다.
JUnit은 각각의 테스트 메서드 마다 테스트 자체를 다시 만들어버립니다. <- 어차피 계속 새로 생성이 되는 거였다..
그리고 초기화가 복잡해지면 필드가 아닌 @BeforeEach를 사용하면 되는 것이였다.
실제로 identityHashCode()를 이용해서 메모리를 찍어보면
1578009262 //memoryRepository
1735507635 //memberService
707161353
1522132780
495702238
73181251
298430307
1970982267
@BeforeEach를 안했을 때도 4개의 테스트 메소드를 실행할 때 마다 계속 달라지는 것을 볼 수 있다.
member를 저장하는 store가 static으로 선언이 되어있기 때문에 clearStore()은 필수로 해야한다.