Basis dalam memori dan pengujian

Dan sekarang yang paling menarik. Saat menguji kode Hibernasi, seringkali Anda ingin bekerja bukan dengan basis nyata, tetapi dengan semacam rintisan yang mengimplementasikan fungsionalitas minimal.

Dapatkah Anda membayangkan rintisan yang mengimplementasikan sebagian besar standar SQL Server? Saya tidak. Namun, database dalam memori sangat bagus. Ini bekerja kira-kira seperti ini:

  • Dalam metode @BeforeAll, kami menginisialisasi koneksi database dalam memori.
  • Dalam metode @BeforeEach, kami mendapatkan sesi dan membuka transaksi.
  • Dalam metode @Test, kami bekerja dengan sesi dan transaksi saat ini.
  • Dalam metode @AfterEach, kami melakukan transaksi.
  • Dan terakhir, dalam metode AfterAll, kita menutup koneksi ke database.

Seperti inilah persiapan untuk ujian itu:

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

Dan inilah tampilan tes itu sendiri dengan karya 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 uji

Anda juga dapat mengisi database pengujian Anda dengan data pengujian.

Biasanya dua file sql dibuat untuk ini:

  • schema.sql berisi skrip yang membuat tabel di database
  • test-data.sql berisi skrip yang mengisi tabel dengan data uji

Pembuatan tabel dan data uji biasanya dipisahkan ke dalam file yang berbeda, karena kelompok data uji mereka sendiri untuk kelompok uji yang berbeda hampir selalu muncul.

Menjalankan file-file ini terlihat seperti ini:

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

Dan metode penyiapan Anda akan sedikit berubah:

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