본문 바로가기
프로그래밍/SpringMVC_기초

회원 관리 예제 - 12 (스프링 통합 테스트)

by ILove_NS_MoKa 2023. 10. 24.

스프링까지 다 올리고 DB까지 연결해서 동작 하는 통합테스트

 

 

service\MemberServiceIntegrationTest.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 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
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("이미 존재하는 회원입니다.");
    }
}
cs

 

@Transactional
애노테이션을 테스트 케이스에 달면 
테스트를 실행할 때 트랙잭션을 먼저 실행을 하고
그 다음에 db에 데이터를 인서트 쿼리를 넣은 다음에
테스트가 끝나면 롤백을 해준다.
그래서 db에 넣었던 데이터가 다 깔끔하게 반영이 안되고 다 지워진다.

 

 

delete from MEMBER; (ctrl+enter)

db 데이터 삭제하는 방법 

 

 

 

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.

@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고,

테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지

않는다.

 

가급적이면 순수한 단위 테스트가 훨씬 좋은 테스트가 좋은케이스가 많다.
컨테이너 까지 어쩔 수 없이 올리는 테스트 케이스면 잘못된 케이스일 확율이 높다