Test code

Gyuhan Park·2022년 9월 4일
0

spring

목록 보기
11/18

@AfterEach

테스트 코드는 다른 테스트 코드와 독립적으로 동작해야 한다.
테스트할 때 데이터를 저장해서 값을 비교하는 경우, 여러 테스트 코드를 한번에 돌렸을 때 값이 중복되어 오류가 날 수 있다.
이때 @AfterEach annotation을 붙이면 각각의 테스트가 끝날 때마다 이 함수가 실행된다. 끝날 때마다 저장된 값을 지워 테스트가 독립적으로 이뤄지도록 한다.

MemoryMemberRepository repository = new MemoryMemberRepository();

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

DI(Dependency Injection)

Service 테스트 코드를 작성할 때도 저장된 값을 지워줘야 하기 때문에 repository를 선언해준다.

MemberService memberService = new MemberService();
MemoryMemberRepository repository = new MemoryMemberRepository();

위와 같이 선언 후 돌리면 테스트 코드는 문제없는 것처럼 동작하지만 문제가 있다. memberService 안에서 동작하는 MemoryMemberRepository위에서 새로 선언한 repository는 다른 instance로 작동한다 !!!

private static Map<Long, Member> store = new HashMap<>();

지금은 MemoryMemberRepository에서 DB 역할을 하는 store를 static으로 선언했기 때문에 다른 instance에서 DB 조작을 해도 문제가 없었지만 같은 repository를 사용하는 게 옳다.

// MemberService
private final MemoryMemberRepository repository;

public MemberService(MemoryMemberRepository memberRepository) {
    repository = memberRepository;
}

// MemberServiceTest
MemberService memberService;
MemoryMemberRepository repository;
    
@BeforeEach
public void beforeEach(){
    repository = new MemoryMemberRepository();
    memberService = new MemberService(repository);
}

service에서는 MemoryMemberRepository 객체를 생성하지 않고 선언만 한 후 생성자의 인자로 받아 의존관계를 형성한다. 이런 식으로 new 하지 않고 외부에서 인자로 받는 것을 DI(Dependency Injection)이라고 한다. 이 부분에 대해서는 나중에 더 자세히 다룰 것이다.

[참고] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글