मेमरी आणि चाचणीचा आधार
आणि आता सर्वात मनोरंजक. हायबरनेट कोडची चाचणी करताना, आपण बर्याचदा वास्तविक बेससह कार्य करू इच्छित नाही, परंतु कमीतकमी कार्यक्षमतेची अंमलबजावणी करणार्या काही प्रकारच्या स्टबसह कार्य करू इच्छित आहात.
एसक्यूएल सर्व्हरच्या बहुतांश मानकांची अंमलबजावणी करणाऱ्या स्टबची तुम्ही कल्पना करू शकता का? मी नाही. तथापि, इन-मेमरी डेटाबेस उत्कृष्ट आहेत. हे अंदाजे असे कार्य करते:
- @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();
}
आणि हायबरनेटच्या कार्यासह चाचणी स्वतः कशी दिसते:
@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