ACHO.pk devlog

[Springboot] 스프링 통합 테스트 본문

프레임워크/Springboot

[Springboot] 스프링 통합 테스트

Acho 2023. 1. 24. 18:07

인프런 김영한 강사님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"의 강의를 듣고 학습하였습니다.


1. MemberServiceTest

직접 객체를 생성해서 넣었다. 메모리 DB에 있는 데이터를 다음 테스트를 위해 지워준다.

순수한 자바 코드이므로 속도가 빠르다!

 

 

2. MemberServiceIntegrationTest

ⓛ test/java/repository/패키지 하위에 "MemberServiceIntegrationTest" 클래스를 만들어준다.

 

 

② MemberServiceIntegrationTest 클래스 내에 코드를 작성한다.

package Springboot.study.service;

import Springboot.study.domain.Member;
import Springboot.study.repository.MemberRepository;
import Springboot.study.repository.MemoryMemberRepository;
import Springboot.study.service.MemberService;
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.context.annotation.Configuration;

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

@SpringBootTest
@Configuration
class MemberServiceIntegrationTest {
    @Autowired
    MemberService memberService;
    @Autowired
    MemberRepository memberRepository;
    @Test
    public void 회원가입() throws Exception {
        //Given
        Member member = new Member();
        member.setName("hello");
        //When
        Long saveId = memberService.join(member);
        //Then
        Member findMember = memberRepository.findById(saveId).get();
        assertEquals(member.getName(), findMember.getName());
    }
    @Test
    public void 중복_회원_예외() throws Exception {
        //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("이미 존재하는 회원입니다.");
    }
}

@SpringBootTest : 스프링 애플리케이션의 통합 테스트임을 의미한다.

@Transactional : 테스트 케이스에 이 어노텐이션이 있으면 테스트 실행 전에 트랜잭션을 시작하고, 테스트가 끝난 후에 항상 롤백한다. 이렇게하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다. 즉, DB의 상태를 변경하는 작업 설정을 쉽게 할 수 있다.

트랜잭션 : DB의 상태를 변경하는 작업

새로운 객체를 만드는 것이 아닌 Spring Bean에 있는 Service와 Repository를 이용한다.

실제 DB와 스프링을 구동하기 때문에 속도가 느리다.

 

 

 

Comments