ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Test] 스프링 부트에서 TestEntityManager를 이용하여 JPA 테스트 하는 방법
    개발 지식/Test 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();

     

Designed by Tistory.