스프링(JAVA)

Spring 회원 관리 예제 - 테스트 코드

beomseok99 2022. 9. 25. 13:08
728x90

이전 포스팅에서 다루었던 회원 리포지토리와 서비스에 대해 테스트를 작성해보겠다.

갑자기 생각난건데, 학생이라면 꼭 jetbrain 홈페이지에서 학생인증하고 인텔리제이 상위버전 사용하자..!

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;

// import static org.assertj.core.api.Assertions.assertThat;

// 테스트는 절대로 순서에 의존하면 안됨

// 개발 -> 테스트 케이스 작성 순서가 아니라
// 테스트 케이스 작성 -> 개발 순서도 존재 Test Driven Development(테스트 주도 개발)
class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach() {
        repository.clearStore(); // 테스트 끝날 때 마다 clear -> 순서에 의존성이 없어야 하기 때문
    }
    @Test
    public void save(){
        Member member = new Member();
        member.setName("spring");

        repository.save(member);
        Member result = repository.findById(member.getId()).get();
        // Assertions.assertEquals(member,result);
        // assertThat(member).isEqualTo(result);
        Assertions.assertThat(member).isEqualTo(result);
    }

    @Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        Member result = repository.findByName("spring2").get();
        Assertions.assertThat(result).isEqualTo(member2);
    }

    @Test
    public void findAll(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        List<Member>result = repository.findAll();
        Assertions.assertThat(result.size()).isEqualTo(2);

    }
}

테스트 클래스 실행 시

위와 같이 된다면 성공적이다.

다음은 회원 서비스 테스트이다.

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 static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;

// 서비스는 함수명을 한글로 해도 가능, 영어권 사람들과 협업하는게 아닌 이상
class MemberServiceTest {

    MemberService memberService ;
    MemoryMemberRepository memberRepository;


    //각 테스트 실행 전에 호출된다. 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고,
    //의존관계도 새로 맺어준다.
    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

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

    // 테스트는 크게 given-when-then으로 이루어짐
    @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);
        //memberService.join(member2);

        //람다 로식 실행 시, IllegalStateException 실행되어야 함 중복이므로
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

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

    }
    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

마찬가지로 클래스 run 했을 때 아까 사진과 같은 모습이면 성공이다.

테스트 코드를 작성할 땐 given, when, then을 적극적으로 활용하는 것이 좋다고 한다.

728x90