[Spring] 회원 서비스 테스트

조은지·2021년 3월 22일
0

Spring

목록 보기
1/2

스프링 입문 - 코드로 배우는 스프링 부트, 웹 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()은 필수로 해야한다.

0개의 댓글