Slaapstandcode testen

Beschikbaar

Basis in geheugen en testen

En nu het meest interessante. Bij het testen van Hibernate-code wil je heel vaak niet met een echte basis werken, maar met een soort stub die minimale functionaliteit implementeert.

Kun je je een stub voorstellen die het grootste deel van de SQL Server-standaard implementeert? Ik niet. In-memory databases zijn als zodanig echter uitstekend. Het werkt ongeveer zo:

  • In de @BeforeAll-methode initialiseren we de in-memory databaseverbinding.
  • Bij de @BeforeEach-methode krijgen we de sessie en openen we een transactie.
  • Bij de methode @Test werken we met de huidige sessie en transactie.
  • Bij de @AfterEach-methode leggen we de transactie vast.
  • En tot slot verbreken we bij de AfterAll-methode de verbinding met de database.

Zo ziet de voorbereiding op de test eruit:

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

En zo ziet de test zelf eruit met het werk van 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());
  }
}

testgegevens

U kunt uw testdatabase ook vullen met testgegevens.

Meestal worden hiervoor twee sql-bestanden gemaakt:

  • schema.sql bevat een script dat tabellen in de database maakt
  • test-data.sql bevat een script dat tabellen vult met testgegevens

Het maken van tabellen en testgegevens worden meestal gescheiden in verschillende bestanden, omdat er bijna altijd eigen groepen testgegevens voor verschillende testgroepen verschijnen.

Het uitvoeren van deze bestanden ziet er als volgt uit:

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

En je installatiemethode zal een beetje veranderen:

@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);
  }
}
Opmerkingen
  • Populair
  • Nieuw
  • Oud
Je moet ingelogd zijn om opmerkingen te kunnen maken
Deze pagina heeft nog geen opmerkingen