स्मृति और परीक्षण में आधार
और अब सबसे दिलचस्प। हाइबरनेट कोड का परीक्षण करते समय, अक्सर आप वास्तविक आधार के साथ काम नहीं करना चाहते हैं, लेकिन किसी प्रकार के स्टब के साथ जो न्यूनतम कार्यक्षमता लागू करता है।
क्या आप एक ऐसे स्टब की कल्पना कर सकते हैं जो अधिकांश SQL सर्वर मानक लागू करता है? मैं नहीं। हालाँकि, इन-मेमोरी डेटाबेस इस तरह से उत्कृष्ट हैं। यह मोटे तौर पर इस तरह काम करता है:
- @BeforeAll मेथड में, हम इन-मेमोरी डेटाबेस कनेक्शन को इनिशियलाइज़ करते हैं।
- @BeforeEach विधि में, हम सत्र प्राप्त करते हैं और एक लेनदेन खोलते हैं।
- @Test पद्धति में, हम वर्तमान सत्र और लेन-देन के साथ काम करते हैं।
- @AfterEach विधि में, हम लेन-देन करते हैं।
- और अंत में, आफ्टरऑल विधि में, हम डेटाबेस से कनेक्शन को बंद कर देते हैं।
यहाँ परीक्षण की तैयारी कैसी दिखती है:
@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 फाइलें बनाई जाती हैं:
- स्कीमा.एसक्यूएल में एक स्क्रिप्ट होती है जो डेटाबेस में टेबल बनाती है
- 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