개발 지식/Test
[Test] 스프링 부트에서 TestEntityManager를 이용하여 JPA 테스트 하는 방법
서하빈
2023. 11. 28. 23:24
JPA의 영속성 컨텍스트의 1차 캐시, 쓰기 지연 SQL 저장소(IDENTITY 전략 시 사용 안됨), 변경 감지 등의 동작을 확인하고 쿼리가 어떻게 날라가는지를 확인하기 위한 테스트를 하고 싶을 때 스프링 부트에서 테스트 하는 방법(추가적으로 지연 로딩, 즉시 로딩도 테스트하고 싶을 때)
예제 코드
@DataJpaTest
public class JpaTest {
@Autowired
private TestEntityManager em;
@Test
void test() {
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setName("A");
member.setTeam(team);
em.persist(member);
em.flush();
em.clear();
Member findMember = em.find(Member.class, member.getId());
System.out.println(findMember.getTeam().getClass()); //지연로딩일 경우 프록시 객체이다.
}
}
- @DataJpaTest 내부에 @AutoConfigureDataJpa, @AutoConfigureTestDatabase, @AutoConfigureTestEntityManager 등이 있어서 JPA와 DB 관련 설정이 자동으로 구성되어 TestEntityManager를 자동주입하여 테스트를 진행할 수 있다.
- 따라서 아래와 같이 EntityManagerFactory와 EntityManager를 직접 생성하는 코드는 필요없게 된다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("name");
EntityManager em = emf.createEntityManager();
- 또한 테스트 코드에서는 자동으로 트랜잭션이 걸리기 때문에 아래와 같은 트랜잭션 코드도 필요없게 된다.
EntityTransaction tx = em.getTransaction();
tx.begin();
tx.commit();
tx.rollback();