ฐานในหน่วยความจำและการทดสอบ
และตอนนี้ที่น่าสนใจที่สุด เมื่อทดสอบรหัส 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