Hibernate 코드 테스트

사용 가능

메모리 기반 및 테스트

그리고 지금 가장 흥미로운. Hibernate 코드를 테스트할 때 실제 기반이 아니라 최소한의 기능을 구현하는 일종의 스텁으로 작업하기를 원하는 경우가 매우 많습니다.

대부분의 SQL Server 표준을 구현하는 스텁을 상상할 수 있습니까? 난 아니야. 그러나 메모리 내 데이터베이스는 그 자체로 탁월합니다. 대략 다음과 같이 작동합니다.

  • @BeforeAll 메서드에서 메모리 내 데이터베이스 연결을 초기화합니다.
  • @BeforeEach 메서드에서 세션을 가져오고 트랜잭션을 엽니다.
  • @Test 메소드에서는 현재 세션 및 트랜잭션으로 작업합니다.
  • @AfterEach 메서드에서 트랜잭션을 커밋합니다.
  • 마지막으로 AfterAll 메서드에서 데이터베이스에 대한 연결을 닫습니다.

테스트 준비는 다음과 같습니다.

@Test
public class HelloTest {
  private static SessionFactory sessionFactory = null;
  private Session session = null;

  @BeforeAll
  static void setup(){
    try {
  	StandardServiceRegistry standardRegistry  = new StandardServiceRegistryBuilder()
      	.configure("hibernate-test.cfg.xml").build();

  	Metadata metadata = new MetadataSources(standardRegistry)
      	.addAnnotatedClass(Employee.class)
      	.getMetadataBuilder()
      	.build();

      sessionFactory = metadata.getSessionFactoryBuilder().build();

    } catch (Throwable ex) {
        throw new ExceptionInInitializerError(ex);
    }
  }

  @BeforeEach
  void setupThis(){
      session = sessionFactory.openSession();
      session.beginTransaction();
  }

  @AfterEach
  void tearThis(){
      session.getTransaction().commit();
  }

  @AfterAll
  static void tear(){
      sessionFactory.close();
  }

그리고 이것은 Hibernate의 작업에서 테스트 자체가 어떻게 보이는지입니다.

@Test
public class HelloTest {

  @Test
  void createSessionFactoryWithXML() {
       Employee emp = new Employee();
       emp.setEmail("demo-user@mail.com");
       emp.setFirstName("demo");
       emp.setLastName("user");

       Assertions.assertNull(emp.getEmployeeId());
       session.persist(emp);
       Assertions.assertNotNull(emp.getEmployeeId());
  }
}

테스트 데이터

테스트 데이터로 테스트 데이터베이스를 채울 수도 있습니다.

일반적으로 이를 위해 두 개의 SQL 파일이 만들어집니다.

  • schema.sql에는 데이터베이스에 테이블을 생성하는 스크립트가 포함되어 있습니다.
  • test-data.sql에는 테스트 데이터로 테이블을 채우는 스크립트가 포함되어 있습니다.

서로 다른 테스트 그룹에 대한 자체 테스트 데이터 그룹이 거의 항상 나타나기 때문에 테이블 생성 및 테스트 데이터는 일반적으로 서로 다른 파일로 분리됩니다.

이 파일을 실행하면 다음과 같습니다.

void runSqlScriptFile(String filePath){
  	String sqlScript = new String( Files.readAllBytes(Paths.get(filePath)) );
  	Session session = sessionFactory.openSession();
      Query query = session.createNativeQuery("BEGIN " + sqlScript + " END;");
      query.executeUpdate()
}

그리고 설정 방법이 약간 변경됩니다.

@BeforeAll
static void setup(){
  try {
	StandardServiceRegistry standardRegistry  = new StandardServiceRegistryBuilder()
    	.configure("hibernate-test.cfg.xml").build();

	Metadata metadata = new MetadataSources(standardRegistry)
    	.addAnnotatedClass(Employee.class)
    	.getMetadataBuilder()
    	.build();

	sessionFactory = metadata.getSessionFactoryBuilder().build();
	runSqlScriptFile(“scema.sql”);
	runSqlScriptFile(“test-data.sql”);

  } catch (Throwable ex) {
      throw new ExceptionInInitializerError(ex);
  }
}
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다