지금까지느 순수한 자바코드로 테스트하였다.
이제부터는 테스트를 스프링이랑 엮어서 해보자.
MemberServiceTest 대신 MemberServiceIntegrationTest라는 클래스를 만들어준다. @SpringBootTest, @Transactional 어노테이션을 붙여준다. 여기서 @SpringBootTest란 스프링 컨테이너와 테스트를 함께 실행하는것이고 @Transactional는 아래에서 살펴보자.
원래는 @BeforeEach 부분에서 객체를 직접 생성해서 작성하였다.
하지만 이제는 스프링 컨테이너에게 받아서 사용하면된다.
생성자 주입방법 같은 여러가지 방법이 있지만,
테스트는 제일 끝단에있기에 테스트 코드를 만들때는 가장 편한 방법을 사용한다.
따라서 필드 기반으로 @Autowired를 사용한다.
MemoryMemberRepository도 MemberRepository로 변경해준다.
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.assertThrows;
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
@Autowired MemberService memberService; // 테스트할 서비스 객체 생성
@Autowired
MemberRepository memberRepository; // 클리어를 위해 생성
// 테스트는 한글로 변경 가능
@Test
void 회원가입() {
//given 뭔가 주어져서
Member member = new Member(); // 멤버 객체 생성
member.setName("spring"); // 멤버에 spring
//when 실행했을때
Long saveId = memberService.join(member); // 회원가입시 아이디가 나오도록 해놓았음
//then 결과
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName()); // 멤버의 이름이 findMember의 이름과 같은지 확인
}
@Test
public void 중복_회원_예외() { // 회원가입시 중복 검사 테스트
//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(("이미 존재하는 회원입니다."));
// try {
// memberService.join(member2);
// fail();
// } catch (IllegalStateException e) {
// assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// }
//then
}
}
회원가입만 빌드 해보면 에러발생
데이터베이스에 데이터들 삭제해줘야한다.
delete from member 쿼리를 통해 데이터를 삭제해준다.
다시 빌드하면 성공
테스트는 반복적으로 실행해야한다.
하지만 회원가입 테스트를 한 번 더 돌리면 이미 spring이 있기때문에 에러발생!
@Transactional 어노텐션을 달면 테스트가 끝나고 롤백을 해준다.
이렇게하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다. 따라서 다른 코드없이 반복해서 테스트가 가능하다.
순수한 자바코드의 테스트는 필요없지않을까?
속도를 비교해보면 순수한 자바코드가 통합테스트보다 비교할 수 없이 빠르다. 따라서 스프링 컨테이너없이 테스트 하는 방법을 연구하고 훈련해야한다.