관리 메뉴

100세까지 코딩

[스프링 입문] 회원 서비스 테스트 본문

백엔드/스프링 입문

[스프링 입문] 회원 서비스 테스트

100세까지 코딩 2023. 12. 5. 16:18

테스트 케이스 단축키 : 테스트를 만들고 싶은 클래스에 들어간 후 Ctrl + Alt + t

회원 서비스 테스트 코드
package hello.hellospring.service;

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


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

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

class MemberServiceTest {
    MemoryMemberRepository memberRepository;
    MemberService memberService;

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

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

    @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("spring");
        //when
        Long saveId = memberService.join(member);
        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외() {
        //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));

        //then
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }

    @Test
    void findMembers() {
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring2");
        //when
        memberService.join(member1);
        memberService.join(member2);
        List<Member> members = memberService.findMembers();
        //then
        assertThat(members).contains(member1, member2);
    }

    @Test
    void findOne() {
        //given
        Member member1 = new Member();
        member1.setName("hello");
        Member member2 = new Member();
        member2.setName("spring");

        //when
        Long saveId = memberService.join(member1);
        Long saveId2 =  memberService.join(member2);
        Member findMember = memberService.findOne(saveId).get();
        //then
        assertThat(findMember.getName()).isEqualTo("hello");
    }
}
테스트 케이스 작성 Tip
1. 테스트 코드명은 한글로 적는 것이 더 직관적일 수 있다.
2. (given: 주어졌을 때, when : 실행했을 때, then : 결과) 를 사용하여 가시성을 높인다.
3. 예외가 발생 테스트 시 try - catch 대신 assertThrows 문법 사용
DI (Dependency Injection) 의존성 주입
public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {  // 외부에서 주입
        this.memberRepository = memberRepository;
    }
class MemberServiceTest {
    MemoryMemberRepository memberRepository;
    MemberService memberService;

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
  • 사용 이유
class MemberServiceTest {
	MemberServiceTest memberService = new MemberService();
    	MemoryMemberRepository memberRepository = new MemoryMemberRepository();
        ...
}
public class MemberService{
	private final MemberRepository memberRepository = new MemoryMemberRepository();
    
    ...
}
public class MemoryMemberRepository implements MemberRepository {
    private static Map<Long,Member> store = new HashMap<>();
    private static long sequence = 0L;
    ...
서비스 테스트에서 필요에 의해 new MemoryMemberRepository를 만든다.
서비스 테스트에서 new MemberService()에서도 new MemoryMemberRepository를 만든다.
2개의 MemoryMemberRepository를 사용하고 있는 것이다.
저장소인 store가 static 변수가 아니면 2개의 서로 다른 db를 가지고 테스트하는 꼴이 된다.
BeforeEach
각 테스트 실행할때 마다 그전에 1회 실행된다.