본문 바로가기

SPRING/Spring

[스프링| 스프링 입문 | 코드로 배우는 스프링] 스프링 통합 테스트

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

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

@SpringBootTest
@Transactional
public class MemberServiceIntegrationTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

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

        //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));

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

    }

}

@SpringBootTest

@SpringBootTest 애노테이션은 스프링 부트의 전체 애플리케이션 컨텍스트를 로드하여 통합 테스트를 위한 환경을 제공합니다. 이 애노테이션을 사용하면 실제 애플리케이션을 실행할 때와 같은 방식으로 빈(Bean) 설정, 환경 변수, 구성 클래스 등이 로드되어 테스트 중에 사용할 수 있습니다. 특히, 데이터베이스 연결, REST 컨트롤러, 서비스 레이어 등의 테스트에 유용하며, 스프링 부트 애플리케이션의 모든 기능을 테스트 환경에서 재현할 수 있습니다.

@Transactional

@Transactional 애노테이션은 테스트 메소드의 실행을 트랜잭션 범위 내에서 실행하도록 합니다. 테스트가 종료되면 이 트랜잭션을 롤백하여, 테스트 과정에서 데이터베이스에 수행된 모든 변경 사항(예: INSERT, UPDATE, DELETE 등)을 원상태로 복구합니다. 이를 통해 테스트 간의 독립성을 보장하고, 한 테스트의 결과가 다른 테스트에 영향을 주지 않도록 합니다. 따라서, 테스트를 반복 실행해도 데이터베이스의 상태는 항상 일정하게 유지됩니다.

이러한 애노테이션들을 사용함으로써, 스프링 애플리케이션의 서비스 레이어나 데이터 접근 레이어 같은 주요 컴포넌트들을 실제 환경과 유사한 조건에서 체계적으로 테스트할 수 있습니다. 또한, 이러한 테스트는 애플리케이션의 견고성을 확보하고, 잠재적인 문제를 사전에 발견하여 수정할 수 있는 기회를 제공합니다.