Pametda asos va testlash
Endi eng qiziqarli qism. Hibernate kodini test qilganda juda ko‘p hollarda haqiqiy bazada ishlashni emas, balki minimal funktsionallikni amalga oshiradigan qandaydir stub bilan ishlashni xohlaysiz.
SQL-server standartining katta qismini amalga oshiradigan stubni tasavvur qilayapsizmi? Men — yo‘q. Ammo buning uchun idealdan biri pametda ma'lumotlar bazalari hisoblanadi. Bu taxminan quyidagi sxema bo‘yicha ishlaydi:
- @BeforeAll metodida pametdagi ma'lumotlar bazasiga ulanishni ishga tushiramiz.
- @BeforeEach metodida sessiyani olib tranzaktsiyani ochamiz.
- @Test metodida hozirgi sessiya va tranzaktsiya bilan ishlaymiz.
- @AfterEach metodida tranzaktsiyani commit qilamiz.
- Va nihoyat, AfterAll metodida bazaga ulanishni yopamiz.
Testga tayyorgarlik ko'rinishi quyidagicha:
// Testga tayyorgarlik
@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 bilan ishlaydigan test quyidagicha ko'rinadi:
// Hibernate bilan test
@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());
}
}
Test ma'lumotlari
Siz test bazangizni test ma'lumotlari bilan to'ldirishingiz mumkin.
Buning uchun odatda ikki sql-fayl yaratiladi:
- schema.sql - bu bazada jadval yaratuvchi skriptni o'z ichiga oladi
- test-data.sql - bu jadvallarni test ma'lumotlari bilan to'ldiruvchi skriptni o'z ichiga oladi
Jadval yaratish va test ma'lumotlari odatda turli fayllarga ajratiladi, chunki deyarli har doim turli test guruhlari uchun o'z test ma'lumotlari guruhlari paydo bo'ladi.
Bu fayllarning bajarilishi quyidagicha ko'rinadi:
// SQL fayl bajarilishi
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()
}
Va sizning setup metodingiz ozgina o'zgaradi:
// Setup metodi
@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);
}
}
O'z Hibernate'ni yozamiz
GO TO FULL VERSION