본문 바로가기

컴퓨터/Spring Boot

[TIL] Spring Boot(intellij) - [DB-3] DB 연결 테스트

* 인프런 김영한 강사님의 스프링 입문 강의 정리

이제 DB를 연결했으니

스프링 컨테이너와 DB까지 연결한 통합 테스트를 진행해본다.

 

전에 진행했던 테스트는 Spring과 관련이 없는 순수한 자바코드를 가진 테스트(단위 테스트)지만

이제 DB가 연결된 상태이므로 스프링과 연결된 통합 테스트를 한다.

 

5. 스프링 통합 테스트 

스프링 통합 테스트를 진행하기 위해 

Test 디렉토리의 service 하위에 

MemberServiceInTest 파일을 생성하였다.

 

[MemberServiceInTest]

package myStudyspring.myStudyspring.service;

import myStudyspring.myStudyspring.domain.member;
import myStudyspring.myStudyspring.repository.memberRepository;
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.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

@SpringBootTest
@Transactional
//c+shi+t -> 자동으로 테스트 클래스 생성
class MemberServiceInTest {

    @Autowired
    MemberService memberService;

    @Autowired
    memberRepository repository;

    @Test
    void join() {
        //given
        member member = new member();
        member.setName("spring");

        //when
        Long saveId = memberService.join(member);

        //then
        member findMember = repository.findById(saveId).get();
        assertEquals(member.getName(), findMember.getName());
    }

    @Test
    public void 중복회원예외() {
        //given
        member member1 = new member();
        member1.setName("spring");

        member member2 = new member();
        member2.setName("spring");

        //when
        memberService.join(member1);

        //방법 1 - assertThrows 사용
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

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


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

 

@SpringBootTest : 스프링 테스트를 실행하는 어노테이션이다. 스프링 빈을 모두 등록하여 테스트에 필요한 의존성을 추가한다. 단위테스트가 아닌 스프링 전체의 flow가 제대로 동작하는지 검증하기 위해 사용한다.

테스트 단위가 커서 디버깅이 까다롭고 시간이 오래 걸린다.

 

 

@Transactional : 테스트 시작 전 트랜잭션을 시작하고 테스트 완료 후 항상 롤백하기 때문에 db에 데이터가 남지 않아 다음 테스트에 영향을 주지 않는다. 

 

 

단위 테스트와 다르게 spring이 올라가는 것을 확인할 수 있다.

 

전에 작성했던 테스트와 같이 스프링 컨테이너 없이 순수한 단위테스트가 좋은 테스트일 가능성이 많으므로

단위마다 테스트를 잘 짤 수 있도록 노력해야한다.

 

728x90