기존 MemberServiceTest 클래스를 이용해서 스프링과 연동된 MemberSerbiceIntegrationTest 클래스를 만들어준다
몇가지 수정사항을 추가한다
@SpringBootTest
@Transactional
//각 test를 실행할때 Transactional을 먼저 실행 후 test가 끝나면 다시 롤백을 해준다
// 이를 통해 테스트로 인해 남은 데이터없이 테스트를 계속 반복 시행할수 있게된다
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void 회원가입() {
//given
Member member = new Member();
member.setName("woonsik");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void 중복_회원_예외() {
//given
Member member1 = new Member();
member1.setName("woonsik1");
Member member2 = new Member();
member2.setName("woonsik1");
//when
memberService.join(member1);
//then
//assertThrows를 사용한 경우 -> 내가 원하는 예외의 클래스가 터지는지 학인한다
assertThrows(IllegalStateException.class, () -> memberService.join(member2));
//반환값으로 받아서 추가적인 확인도 가능하다
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다");
}
}
실제 DB와 연동되어 테스트를 할수있다는 장점이있지만 spring컨테이너를 전부 올리고 테스트를 진행하게 되어서 속도가 매우 느리다. 따라서 이전에 사용한
MemberServiceTest class
와 같이 로컬의 메모리를 이용해서 진행하는 테스트인 순수한 단위 테스트를 활용하는 것이 좋은 테스트이다. 기능마다 세부적으로 나누어서 순수한 단위 테스트로 전부 테스트할 수 있게 하는것이 좋다