ฐานในหน่วยความจำและการทดสอบ

และตอนนี้ที่น่าสนใจที่สุด เมื่อทดสอบรหัส Hibernate บ่อยครั้งที่คุณไม่ต้องการทำงานกับฐานจริง แต่กับโครงร่างบางประเภทที่ใช้ฟังก์ชันการทำงานขั้นต่ำ

คุณนึกภาพโครงที่ใช้มาตรฐาน SQL Server ส่วนใหญ่ได้หรือไม่ ฉันไม่. อย่างไรก็ตาม ฐานข้อมูลในหน่วยความจำนั้นยอดเยี่ยมมาก มันทำงานประมาณนี้:

  • ในเมธอด @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();
  }

และนี่คือลักษณะของการทดสอบด้วยการทำงานของ 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());
  }
}

ข้อมูลการทดสอบ

คุณยังสามารถเติมฐานข้อมูลทดสอบของคุณด้วยข้อมูลการทดสอบ

โดยปกติจะมีการสร้างไฟล์ 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);
  }
}