5. 회원 서비스 테스트

Cmd+Shift+T : 테스트케이스 생성 단축키! 세상 편리함!!!

MemberService 클래스와 MemberServiceTest를 만들어서 테스트할 때 의문점

MemberService에서도 MemoryMemberRepository 객체를 생성하고, 테스트코드에서도 객체를 생성한다. MemberService의 객체에 대해서 테스트를 수행해야하는데 두 객체가 다르다면 각각의 객체는 다른 값을 가지고 있을 수 있다.

현재 구현되어있는 MemoryMemberRepository를 보면 Map storee가 static으로 선언되어있는 것을 알 수 있다. static으로 되어있기 때문에 문제가 없지만, static을 빼는 순간 문제가 발생한다!

public class MemoryMemberRepository implements MemberRepository{
    private static Map<Long,Member> store = new HashMap<>();//(참고 : 현업=>공유되는변수일 경우 concurrenthashmap을 써야함)
    private static long sequence = 0L;//sequence는 0/1/2 키값 생성하주는 애. 이또한 마찬가지로 현업에서는 동시성 문제로 autumnLong으로 해줘야함.
    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(),member);//맵에 저장.
        return member;//저장된 결과 반환.
    }

그래서 같은 객체에 대해 테스트를 수행하기 위해 MemberService 코드를 아래와 같이 수정한다. 기존에 new로 생성했던 객체를 constructor를 이용해서 외부에서 객체를 생성해서 넣어주는 것을 Dependency Injection(DI)라고 한다!

public class MemberService {
    //private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final MemberRepository memberRepository;
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

또한, 순서나 의존관계를 피하기 위해 BeforeEach, AfterEach 어노테이션도 추가해준다! BeforeEach : 코드가 실행되기전에 수행한다. MemoryMemberRepository 객체를 생성해서 memberService에 넣어준다!

@BeforeEach
    public void beforeEach(){//동작하기 전에 넣어준다!
        //memberRepository 객체를 생성해서 memberService 객체에 넣어준다!
        //이렇게 하면 같은 MemoryMemberRepository 객체가 사용된다!
         memberRepository = new MemoryMemberRepository();
         memberService = new MemberService(memberRepository);
    }
    @AfterEach//메서드 실행이 끝날 때마다 동작한다. save() 끝나고 afterEach(), findByName() 끝나고 afterEach(), findAll() 끝나고 afterEach()
    public void afterEach(){
        memberRepository.clearStore();
    }

Last updated