Hafızadaki temel ve test etme

Ve şimdi en ilginç olanı. Hazırda Beklet kodunu test ederken, çoğu zaman gerçek bir temelle değil, minimum işlevsellik uygulayan bir tür saplama ile çalışmak istersiniz.

SQL Server standardının çoğunu uygulayan bir saplama hayal edebiliyor musunuz? Beni değil. Ancak, bellek içi veritabanları bu haliyle mükemmeldir. Kabaca şu şekilde çalışır:

  • @BeforeAll yönteminde in-memory veritabanı bağlantısını başlatıyoruz.
  • @BeforeEach metodunda ise session'ı alıp bir işlem açıyoruz.
  • @Test yönteminde, mevcut oturum ve işlemle çalışıyoruz.
  • @AfterEach yönteminde işlemi gerçekleştiriyoruz.
  • Ve son olarak AfterAll metodunda database bağlantısını kapatıyoruz.

Test için hazırlık şu şekildedir:

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

Ve Hibernate'in çalışmasında testin kendisi böyle görünüyor:

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

test verisi

Test veritabanınızı test verileriyle de doldurabilirsiniz.

Bunun için genellikle iki sql dosyası yapılır:

  • schema.sql, veritabanında tablolar oluşturan bir komut dosyası içerir
  • test-data.sql, tabloları test verileriyle dolduran bir komut dosyası içerir

Tablo oluşturma ve test verileri genellikle farklı dosyalara ayrılır, çünkü farklı test grupları için kendi test verileri grupları neredeyse her zaman görünür.

Bu dosyaları yürütmek şöyle görünür:

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

Ve kurulum yönteminiz biraz değişecek:

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