Pangkalan dalam ingatan dan ujian

Dan kini yang paling menarik. Apabila menguji kod Hibernate, selalunya anda mahu bekerja bukan dengan asas sebenar, tetapi dengan beberapa jenis stub yang melaksanakan fungsi minimum.

Bolehkah anda bayangkan sebuah rintisan yang melaksanakan kebanyakan standard SQL Server? Bukan saya. Walau bagaimanapun, pangkalan data dalam memori sangat baik seperti itu. Ia berfungsi kira-kira seperti ini:

  • Dalam kaedah @BeforeAll, kami memulakan sambungan pangkalan data dalam memori.
  • Dalam kaedah @BeforeEach, kami mendapat sesi dan membuka transaksi.
  • Dalam kaedah @Test, kami bekerja dengan sesi dan transaksi semasa.
  • Dalam kaedah @AfterEach, kami melakukan transaksi.
  • Dan akhirnya, dalam kaedah AfterAll, kami menutup sambungan ke pangkalan data.

Berikut ialah persediaan untuk ujian:

@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 ini adalah bagaimana ujian itu sendiri kelihatan seperti kerja 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 ujian

Anda juga boleh mengisi pangkalan data ujian anda dengan data ujian.

Biasanya dua fail sql dibuat untuk ini:

  • schema.sql mengandungi skrip yang mencipta jadual dalam pangkalan data
  • test-data.sql mengandungi skrip yang mengisi jadual dengan data ujian

Data pembuatan jadual dan ujian biasanya dipisahkan ke dalam fail yang berbeza, kerana kumpulan data ujian mereka sendiri untuk kumpulan ujian yang berbeza hampir selalu muncul.

Melaksanakan fail ini kelihatan 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 kaedah persediaan anda akan berubah sedikit:

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