Alap a memóriában és a tesztelésben

És most a legérdekesebb. A Hibernate kód tesztelésekor nagyon gyakran nem valódi alappal akarunk dolgozni, hanem valamilyen minimális funkcionalitást megvalósító csonkkal.

El tud képzelni egy csonkot, amely megvalósítja az SQL Server szabvány nagy részét? Én nem. A memórián belüli adatbázisok azonban önmagukban kiválóak. Ez nagyjából így működik:

  • A @BeforeAll metódusban inicializáljuk a memórián belüli adatbázis-kapcsolatot.
  • A @BeforeEach metódusban megkapjuk a munkamenetet, és megnyitunk egy tranzakciót.
  • A @Test metódusban az aktuális munkamenettel és tranzakcióval dolgozunk.
  • Az @AfterEach metódusban véglegesítjük a tranzakciót.
  • Végül az AfterAll metódusban lezárjuk a kapcsolatot az adatbázissal.

Így néz ki a tesztre való felkészülés:

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

Maga a teszt pedig így néz ki a Hibernate munkájával:

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

teszt adat

A tesztadatbázist tesztadatokkal is feltöltheti.

Általában két sql fájl készül ehhez:

  • A schema.sql tartalmaz egy parancsfájlt, amely táblákat hoz létre az adatbázisban
  • A test-data.sql egy szkriptet tartalmaz, amely tesztadatokkal tölti fel a táblákat

A táblázatkészítés és a tesztadatok általában különböző fájlokba vannak szétválasztva, mivel szinte mindig megjelennek a különböző tesztcsoportokhoz tartozó saját tesztadatok csoportjai.

A fájlok végrehajtása így néz ki:

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

És a beállítási módszer egy kicsit megváltozik:

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