Base sa memorya at pagsubok
At ngayon ang pinaka-kawili-wili. Kapag sinusubukan ang Hibernate code, madalas na gusto mong magtrabaho hindi gamit ang isang tunay na base, ngunit may ilang uri ng stub na nagpapatupad ng kaunting functionality.
Maaari mo bang isipin ang isang stub na nagpapatupad ng karamihan sa pamantayan ng SQL Server? hindi ako. Gayunpaman, ang mga in-memory database ay napakahusay tulad nito. Gumagana ito nang halos ganito:
- Sa paraang @BeforeAll, sinisimulan namin ang in-memory na koneksyon sa database.
- Sa paraang @BeforeEach, nakukuha namin ang session at nagbubukas ng transaksyon.
- Sa paraan ng @Test, nakikipagtulungan kami sa kasalukuyang session at transaksyon.
- Sa paraang @AfterEach, ginagawa namin ang transaksyon.
- At sa wakas, sa paraan ng AfterAll, isinasara namin ang koneksyon sa database.
Narito ang hitsura ng paghahanda para sa pagsusulit:
@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();
}
At ganito ang hitsura ng pagsubok mismo sa gawain ng 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());
}
}
data ng pagsubok
Maaari mo ring punan ang iyong database ng pagsubok ng data ng pagsubok.
Karaniwan ang dalawang sql file ay ginawa para dito:
- Ang schema.sql ay naglalaman ng isang script na lumilikha ng mga talahanayan sa database
- Ang test-data.sql ay naglalaman ng isang script na naglalagay ng mga talahanayan na may data ng pagsubok
Ang paggawa ng talahanayan at data ng pagsubok ay karaniwang pinaghihiwalay sa iba't ibang mga file, dahil halos palaging lumalabas ang kanilang sariling mga pangkat ng data ng pagsubok para sa iba't ibang pangkat ng pagsubok.
Ang pagsasagawa ng mga file na ito ay ganito ang hitsura:
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()
}
At medyo magbabago ang iyong paraan ng pag-setup :
@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);
}
}