jpa:
hibernate:
ddl-auto: create//애플리케이션 실행시점에서 내가 가진 테이블 다 지우고 다시 생성한다.
테스트용 Entity와 Repository 생성
Repository란 Entity를 찾아준다.
스프링이 제공하는 @Repository 애노테이션 사용
JPA를 사용하기 때문에 Entity Manager 있어야한다.
@PersistenceContext를 사용하면 스프링 부트에서 자동으로 EntityManager로 등록해서 사용된다.
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
public class Test(){
@PersistenceContext
private EntityManager em;
}
EntityManager를 통한 데이터 변경은 모두 트랜잭션 안에서 이뤄져야한다! 그래서 트랜잭션이 있어야 한다!(JPA 기본편에서 강조한 내용이라고 함)
@Transactional 이 Test 위에 있으면 일반적으로 롤백한다!
그러니까 데이터를 저장하는 것을 실행해도 테이블만 생성되고 데이터는 들어가지 않는다! 테스트를 위해서는 데이터 저장이 안되는 것이 맞지만, 데이터가 잘 들어갔는지 확인하고자 한다면 @RollBack(false)로 해주면 된다!
같은 트랜잭션 안에서 객체 생성, 저장한 객체를 비교하면 영속성 컨텍스트가 똑같다.
아래 코드에서 given 절의 member와 memberRepository에 이 member를 저장하고, 이 id에 의해 memberRepository에서 찾은 Member를 findMember라고 하면 member == findMember 는 true를 만족한다!
package jpabook.jpashop;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
@Transactional//자바 표준과 스프링에서 제공하는 2가지가 있는지 스프링 종속적 개발하기 때문에 스프링에서 제공하는 걸 쓴다!
@Rollback(false)
public void testMember() throws Exception{
//given
Member member = new Member();
member.setUsername("memberA");
//when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);
//then(검증)
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
Assertions.assertThat(findMember).isEqualTo(member);
System.out.println("findMember == member" +(findMember == member));
}
}
테스트 시 Tip💡
SQL 파라미터 로그를 남길 수 있다.
단, 실제 운영 환경에서 배포할 땐 성능을 고려해야한다!
외부 라이브러리 사용
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'