그럼 이제 우리가 구현하고 있는 커피 주문 샘플 애플리케이션에서 MemberRepository를 테스트해보도록 하겠습니다.
✅ 회원 정보 저장 테스트
package com.springboot.slice.repository.member;
import com.springboot.member.entity.Member;
import com.springboot.member.repository.MemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest // (1)
public class MemberRepositoryTest {
@Autowired
private MemberRepository memberRepository; // (2)
@Test
public void saveMemberTest() {
// given (3)
Member member = new Member();
member.setEmail("[email protected]");
member.setName("홍길동");
member.setPhone("010-1111-2222");
// when (4)
Member savedMember = memberRepository.save(member);
// then (5)
assertNotNull(savedMember); // (5-1)
assertTrue(member.getEmail().equals(savedMember.getEmail()));
assertTrue(member.getName().equals(savedMember.getName()));
assertTrue(member.getPhone().equals(savedMember.getPhone()));
}
}
코드 3-195에서는 MemberRepository의 save() 메서드가 잘 동작하는지 테스트하고 있습니다.
Spring에서 데이터 액세스 계층을 테스트하기 위한 가장 핵심적인 방법은 바로 (1)과 같이 @DataJpaTest 애너테이션입니다.
@DataJpaTest 애너테이션을 테스트 클래스에 추가함으로써, MemberRepository의 기능을 정상적으로 사용하기 위한 Configuration을 Spring이 자동으로 해주게 됩니다.
@DataJpaTest 애너테이션은 @Transactional 애너테이션을 포함하고 있기 때문에 하나의 테스트 케이스 실행이 종료되는 시점에 데이터베이스에 저장된 데이터는 rollback 처리됩니다.
즉, 여러 개의 테스트 케이스를 한꺼번에 실행시켜도 하나의 테스트 케이스가 종료될 때마다 데이터베이스의 상태가 초기 상태를 유지한다는 것입니다.
(2)에서 테스트 대상 클래스인 MemberRepository를 DI 받습니다.
(3)에서 테스트할 회원 정보 데이터(member)를 준비합니다.
(4)에서 회원 정보를 저장합니다.
(5)에서 회원 정보가 잘 저장되었는지 검증(Assertion)합니다.
이처럼 Spring에서 데이터 액세스 계층의 기능을 테스트하는 건 어렵지 않습니다.
바로 @DataJpaTest라는 애너테이션이 있기 때문입니다.