본문 바로가기
코드로 배우는 스프링 부트 - 인프런

스프링 통합 테스트

by step 1 2022. 8. 18.
반응형

JDBC를 이용하여 스프링과 DB를 연결한 후 테스트를 진행하는 코드를 작성한다.

 

@Transactional: DB에서는 기본적으로 커밋을 해야 데이터가 최종적으로 저장되는데, 해당 어노테이션을 선언하면 자동적으로 롤백을 해주어서 테스트 데이터가 최종적으로 저장되지 않도록 해준다.

따라서, 반복적으로 같은 데이터로 테스트를 진행할 수 있다.

 

@SpringBootTest: 스프링 컨테이너와 테스트를 함께 실행한다.-> 스프링이 실제로 구동된다.

 

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
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.transaction.annotation.Transactional;

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

// 테스트는 한글로 바꾸어도 된다.
// 빌드될때 테스트코드는 포함되지 않는다.
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

//  컨테이너로 부터 주입받는다.
//  테스트를 진행할 때는 편하게 @Autowired 사용하면 된다. -> 필드 주입 방법(DI)
    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;


    @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);
        // member2를 join 할 때 IllegalStateException이 발생하것을 예상하는 코드 
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//        assertThrows(NullPointerException.class,() -> memberService.join(member2));

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

}

순수한 단위 테스트는 스프링 컨테이너 없이 하는 순수한 자바코드로 되어진 각각의 기능을 테스트하는 것이다. 

단위테스트가 실행속도가 빠르고 최소 단위로 진행하는 테스트이기 때문에 정말 중요하다고 한다.

 

통합테스트는 스프링 컨테이너와 DB까지 함께 테스트를 진행하는 것을 말한다.

 

테스트에서의 주의사항은 반드시 테스트용 DB를 이용하거나 로컬에서만 사용하는 DB를 이용해야한다.

운영중인 DB를 바라보게하고 테스트를 진행하면 안된다.

반응형

'코드로 배우는 스프링 부트 - 인프런' 카테고리의 다른 글

JPA  (0) 2022.08.22
스프링 JDBC Template  (0) 2022.08.19
순수 JDBC  (0) 2022.08.17
H2 데이터베이스 설치  (0) 2022.08.16
회원 웹 기능 - 조회  (0) 2022.08.15