스프링 통합 테스트

2023. 5. 2. 06:53카테고리 없음

회원 서비스 스프링 통합 테스트

package com.example.demo.service;

import com.example.demo.Repository.MemberRepository;
import com.example.demo.Repository.MemoryMemberRepository;
import com.example.demo.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.transaction.annotation.Transactional;

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

@SpringBootTest // 스프링 컨테이너와 테스트를 함께 실행하는것.
@Transactional
class MemberServiceintegrationTest {

    @Autowired MemberService memberService; //Test는 필드 주입으로 받는 것도 편하다. 다른곳에서 쓸것도 아니고 이 곳에서 
    @Autowired MemoryMemberRepository memberRepository; // 오직 테스트만 하기 위해서 만든것이기 때문이다.

    // 기본적으로 db에는 transaction 이라는 개념가 있는데, db에 데이터를 넣고 commit을 해야
    // 한다. 근데 만약 테스트 다하고 롤백을 해버리면 그 안에 데이터가 다 빠져나가게됨.
    // 말 그대로 @Transactional을 먼저 넣고 실행하게 되면 transaction을 먼저 읽고 나머지 코드를 실행하기 때문에
    // 원래 코드에는 db에 코드로 실행했던 데이터를 넣고 그 안에 저장을 해주는데 @Transactional로 인해서 다시 지워지는것
    // 그래서 다시 db에서 실행을 해도 저장된 데이터가 없는 것이다.(반영을 안한다고 생각하면 편함.)

    @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("spring100");

        //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("이미 존재하는 회원입니다.");
    }


}