김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.
스프링 컨테이너와 DB가 연결된 것을 확인하는 것이 스프링 통합 테스트이다.
packagehello.hellospring.service;
importhello.hellospring.domain.Member;
importhello.hellospring.repository.MemberRepository;
importhello.hellospring.repository.MemoryMemberRepository;
importorg.junit.jupiter.api.AfterEach;
importorg.junit.jupiter.api.BeforeEach;
importorg.junit.jupiter.api.Test;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.transaction.annotation.Transactional;
importjava.sql.SQLException;
import staticorg.assertj.core.api.Assertions.assertThat;
import staticorg.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest//스프링을 테스트할 때는 해당 어노테이션을 통해 쉽게 테스트 할 수 있다.
@Transactional
/*
테스트 케이스에 @Transactional를 붙이면,테스트 시작 전에 트랜잭션을 시작하고,테스트 완료 후에 항상 rollback함
단,서비스나 컨트롤러에 붙으면 rollback하지않고 정상적으로 작동한다.
만약 rollback하지 않으려면 @Commit을 붙이면 됨
=>다음 테스트를 반복해서 진행할 수 있다.
*/
classMemberServiceIntegrationTest {
@AutowiredMemberService memberService;
@AutowiredMemberRepository memberRepository;
@Test
void회원가입()throwsSQLException {
// Test는 한글로 바꿔도 상관없다
// given (이런 상황이 주어져서)
Member member =newMember();
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중복_회원_예외()throwsSQLException {
// given
Member member1 =newMember();
member1.setName("spring");
Member member2 =newMember();
member2.setName("spring");
// when
memberService.join(member1);
//예외처리 방법2
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
// member2를 넣으면 IllegalStateException예외가 발생해야됨
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}