
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행@Transactional : 테스트 시작 전에 트랜잭션을 시작, 테스트 완료 후 롤백MemberService가 MemberRepository에 의존하는지 확인.INSERT 이후 데이터가 저장되었는지 확인하고 테스트 후 원상복구MockMvc를 이용한 HTTP 요청 시나리오 검증📂 MemberServiceIntegrationTest
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
// 📌 구현체는 @Configuration한 곳에서 주입받음
@Autowired MemberRepository memberRepository;
// 📌 직접 객체 생성 방식❌ -> 스프링 컨테이너에게 주입받는 방식으로 변경
// @BeforeEach
// void beforeEach(){
// memberRepository = new MemoryMemberRepository();
// memberService = new MemberService(memberRepository);
// }
// 📌 테스트의 반복 가능 -> @Transactional로 해결
// @AfterEach
// void afterEach(){
// memberRepository.clearStore();
// }
@Test
// @Commit // 테스트 데이터가 롤백되지않고 DB에 반영
void 회원가입() {
// given
Member member = new Member();
member.setName("zizon의연v");
// when
Long savedId = memberService.join(member);
// then
// Service의 findMember()로 테스트
Member findMember1 = memberService.findMember(savedId).get();
assertThat(member.getName()).isEqualTo(findMember1.getName());
// Repository의 findById()로 테스트
Member findMember2 = memberRepository.findById(savedId).get();
}
@Test
void 중복_회원_예외(){
// given
Member member1 = new Member();
member1.setName("zizon의연v");
Member member2 = new Member();
member2.setName("zizon의연v");
// when
memberService.join(member1);
// then
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
...
}
스프링 부트 통합 테스트(@SpringBootTest)에서 @Transactional을 붙이면,
@Transactional은rollback()이 실행됨