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