초코딩(chocoding)

[springboot/인프런] 코드로 배우는 스프링 부트 - 회원 서비스 테스트 본문

SpringBoot

[springboot/인프런] 코드로 배우는 스프링 부트 - 회원 서비스 테스트

sweetychocoding 2024. 4. 17. 15:11
728x90

이전 테스트에서는 test 패키지, 서비스 직접 다 만들어주었다.

하지만 해당 클래서에서 ctrl + shift + t (윈도우 기준)를 누르면 자동으로 테스트 코드를 생성해준다.

 

 

메서드 선택 후 ok 버튼 클릭 시,

 

짜잔~

잘 생성된 것을 볼 수 있다.

 

강사님께서 말씀하시기를 테스트 코드는 빌드될 때 제외되는 코드이기 때문에

회사에서 외국 클라이언트를 상대하는 것이 아닌 이상

직관적으로 보기 위하여 테스트 코드 한정 한글로 메서드 이름을 적는 경우도 있다고 하셨다.

 

 

<여기서 잠깐!!>

- static import 단축키

=> alt + enter

 

- parameter 추출

=> ctrl + alt + v

 

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;

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

    /*
        회원 가입
        */
    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> findMember() {
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

 

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();
    }

    @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));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

/*        try {
            memberService.join(member2);
            fail();
        } catch (IllegalStateException e) {
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }*/

        //then
    }

    @Test
    void findMember() {
    }

    @Test
    void findOne() {
    }
}

 

이전 코드에서는 동일한 repositroy를 사용하는 것이 아닌 각각의 repository를 생성하여서 사용하였다.

하지만 생각해보면 그리 좋은 방법은 아니다.

하나의 저장소를 공유하는 것이 맞다.

따라서 직접 new를 통해 repository를 직접 생성하는 것이 아니라 외부에서 끌어다가 주입을 하였다.

=> 이것을 의존성 주입이라고 함

 

728x90