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);
  }
}