회원 리포지토리 테스트 케이스 작성

개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번 에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.

회원 리포지토리 메모리 구현체 테스트

// src/test/java

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Optional;

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {
		MemoryMemberRepository repository = new MemoryMemberRepository(); 

    @AfterEach
		public void afterEach() { 
        repository.clearStore(); 
    }
    @Test
		public void save() { 
				//given
				Member member = new Member();
				member.setName("spring");
				//when
				repository.save(member);
				//then
				Member result = repository.findById(member.getId()).get();

(result).isEqualTo(member);
    } 
    @Test
		public void findByName() { 
				//given
				Member member1 = new Member();
        member1.setName("spring1"); 
        repository.save(member1);Member member2 = new Member();
        member2.setName("spring2"); 
        repository.save(member2);
				//when
				Member result = repository.findByName("spring1").get(); 
				//then
				assertThat(result).isEqualTo(member1);
    } 
    @Test
		public void findAll() { 
				//given
				Member member1 = new Member();
				member1.setName("spring1"); 
				repository.save(member1);
				Member member2 = new Member();
				member2.setName("spring2"); 
				repository.save(member2);
				//when
				List<Member> result = repository.findAll(); 
				//then
				assertThat(result.size()).isEqualTo(2);
    } 
}

회원 서비스 개발

package hello.hellospring.service; 

import hello.hellospring.domain.Member;import hello.hellospring.repository.MemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {
		private final MemberRepository memberRepository = new 
MemoryMemberRepository();
    /** 
     * 회원가입 
     */
		public Long join(Member member) {
				validateDuplicateMember(member); //중복 회원 검증
        memberRepository.save(member);
				return member.getId();
    }
		private void validateDuplicateMember(Member member) { 
        memberRepository.findByName(member.getName()) 
                .ifPresent(m -> {
											throw new IllegalStateException("이미 존재하는 회원입니다.");
                }); 
}

    /**
     * 전체 회원 조회 
     */
		public List<Member> findMembers() { 
					return memberRepository.findAll();
		}
	
		public Optional<Member> findOne(Long memberId) { 
				return memberRepository.findById(memberId);
		} 
}

회원 서비스 테스트

기존에는 회원 서비스가 메모리 회원 리포지토리를 직접 생성하게 했다.

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

*회원 리포지토리의 코드가 회원 서비스 코드를 ID 가능하게 변경한다.

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

회원 서비스 테스트

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;

class MemberServiceTest {
		MemberService memberService; 
		MemoryMemberRepository memberRepository;

    @BeforeEach
		public void beforeEach() {
        memberRepository = new MemoryMemberRepository(); 
        memberService = new MemberService(memberRepository);    
		}

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

    @Test
		public void 회원가입() throws Exception {
				//Given
				Member member = new Member();
        member.setName("hello");

				//When
				Long saveId = memberService.join(member); 

				//Then
				Member findMember = memberRepository.findById(saveId).get(); 
				assertEquals(member.getName(), findMember.getName());
    } 

    @Test
		public void 중복_회원_예외() throws Exception {
				//Given
				Member member1 = new Member();
        member1.setName("spring");

				Member member2 = new Member();
        member2.setName("spring");

				//When
        memberService.join(member1);
				IllegalStateException e = assertThrows(IllegalStateException.class,
                () -> memberService.join(member2));//예외가 발생해야 한다.
				assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    } 
}