메모리 기반 및 테스트
그리고 지금 가장 흥미로운. 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);
}
}
GO TO FULL VERSION