public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository;
class MemberServiceTest {
MemberService memberService = new MemberService;
MemoryMemberRepository memoryMemberRepository = new MemoryMemberRepository();
MemberService의 new MemoryMemberRepository와
MemberServiceTest의 new MemoryMemberRepository는 서로 다른 객체다.
- new MemoryMemberRepository를 굳이 두 개를 쓸 이유가 없다.
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
MemeryMemberRepository가 지금은 static 객체가 있어서 여러 개의 MemoryMemberRepository 인스턴스가 만들어져도 이 변수들은 공유됨
- new 객체가 두 개 이상이면 인스턴스가 달라 db가 달라질 수 있음
- 같은 내용물로 test 하기 위해선 같은
MemoryMemberRepository 인스턴스로 테스트해야 함
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
MemberService에 외부에서 memberRepository를 넣어줌
MemberService는 의존성 주입을 통해 MemberRepository 인터페이스의 구현체를 받음
- 이는
MemberService가 MemberRepository에 의존
MemberService는 어떤 구현체(MemoryMemberRepository이든 뭐든)가 들어올지 알지 못하고 MemberRepository 인터페이스의 메서드만 사용
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@beforeEach
- 각 테스트 메서드가 실행되기 전에 먼저 실행
memberService를 생성할 때, 테스트 동작 전 MemoryMemberRepository를 안에 넣어줘야함
- 테스트 실행할 때마다 인스턴스를 독립적으로 생성
memberService = new MemberService(memberRepository);에서 new MemberService는 MemberService 클래스의 생성자로 이동
- 초기화 로직을 beforeEach에 넣어, 각 테스트 메소드에서 이 로직을 반복적으로 작성할 필요가 없음
beforeEach() 메서드가 각 테스트 메서드가 실행되기 전에 호출되므로, 각 테스트가 독립적인 MemoryMemberRepository 인스턴스를 사용
- 이렇게 초기화되는
MemoryMemberRepository 인스턴스는 '빈' 상태(아직 어떠한 회원 정보도 저장되지 않은 초기 상태)
- 각 테스트는 '빈'
emoryMemberRepository 인스턴스를 이용하여 독립적으로 실행