728x90
(인프런) 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 공부하고 리뷰한 글입니다.
이전에 했던 회원 서비스 테스트(MemberServiceTest) 같은 경우는 실제로 순수 자바로만 테스트 하는 단위 테스트 였다. 하지만
이전에 했던 회원 서비스 테스트가 궁금하다면 여기
1. 회원 서비스 스프링 통합 테스트
1) Test/service 패키지에 MemberServcieTest를 복사한 MemberServiceIntegrationTest 클래스 생성
2) MemberServiceIntegrationTest 클래스 위에 @SpringBootTest 추가
3) @BeforeEach 삭제 → @Autowired 로 스프링 컨테이너에서 메모리 서비스, 메모리 리퍼지토리 사용하기
기존 MemberService 에는 각 테스트 실행 전에 메모리 리퍼지토리, 메모리 서비스 객체를 생성하도록 하였다. 하지만 여기서는 @Autowired를 통해 스프링 컨테이너에 있는 MemoryService, MemoryRepository를 사용할 수 있게 된다.
4) @AfterEach 삭제 → @Transactional 로 DB 자동 ROLLBACK
기존 MemberService 에는 각 테스트 실행 후에는 메모리에 저장된 값을 비워주는 코드를 작성했었다.
하지만 여기서는 @Transactional을 클래스 앞에 명시하는 것으로 대신한다.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
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.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
// 우리가 저장한 것이 repository에 저장되었는지 검사
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); // member1 회원가입
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2)); // member2 회원가입 시 예외 발생
// 위에서 발생한 예외가 중복 회원 가입 예외인지 검증
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
}
- @Transactonal: 테스트 케이스에 이 어노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
- @SpringBootTest: 스프링 컨테이너와 테스트를 함께 실행한다.
728x90
'Spring > 스프링 입문' 카테고리의 다른 글
[스프링 입문] 06. 스프링 DB 접근 기술 - JPA (0) | 2022.04.29 |
---|---|
[스프링 입문] 06. 스프링 DB 접근 기술 - 스프링 JdbcTemplate (0) | 2022.04.29 |
[스프링 입문] 06. 스프링 DB 접근 기술 - 순수 JDBC (0) | 2022.04.29 |
[스프링 입문] 06. 스프링 DB 접근 기술 - H2 데이터베이스 설치 (0) | 2022.04.28 |
[스프링 입문] 05. 회원 관리 예제(웹 MVC 개발) - 회원 웹 기능3(조회) (0) | 2022.04.28 |