2.5.2.2. Definition der Datenbankstruktur im DatabaseDescriptionCallback

Checkerberry db vergleicht XML-Testdaten mit Daten aus der Datenbank. Aus diesem Grund ist es erforderlich, dass checkerberry db die Struktur (Tabellen und Spalten) der verwendeten Datenbank kennt. Die Definition der erforderlichen Informationen erfolgt über eine Implementation des Interfaces DatabaseDescriptionCallback. Folgendes Code-Beispiel enthält das Interface.

Beispiel 2.66. Interface DatabaseDescriptionCallback

/**
 * Callback-Interface zur Definition der Datenbankbeschreibung.
 */
public interface DatabaseDescriptionCallback {

  /**
   * Erzeugt die Datenbankbeschreibung, indem für alle Tabellen die Lookup Key
   * Spalten definiert werden.
   *
   * @param databaseDescription
   *            zu initialisierende Datenbankbeschreibung.
   * @see DatabaseDescription#addTableDescription(String, String...)
   */
  void createDatabaseDescription(DatabaseDescription databaseDescription);
}


Da die Datenbankstruktur für jede System-Umgebung unterschiedlich ist, gibt es keine Basisklasse für die Implementierung des Interfaces. Das folgende Code-Beispiel zeigt eine exemplarische Implementation.

Beispiel 2.67. Beispiel-Implementierung des DatabaseDescriptionCallbacks

/**
 * Spezielles Callback zur Definition der Datenbank-Struktur.
 */
public class SampleDatabaseDescriptionCallback
    implements DatabaseDescriptionCallback {

  /**
   * {@inheritDoc}
   */
  public void createDatabaseDescription(
      DatabaseDescription databaseDescription) {

    // Tabelle USERS hat die Spalten NAME und SURNAME als Lookup-Keys.
    databaseDescription.addTableDescription("USERS", "NAME", "SURNAME");
    // Tabelle COUNTRIES hat die Spalte CODE als Lookup-Key. Die Tabelle
    // kann im Cache gespeichert warden.
    databaseDescription.addTableDescription("COUNTRIES", Cacheable.Yes,"CODE");
    // Tabelle NOTES hat die Spalte ID als Lookup-Key. Die
    // Spalte UPDATE_DATE wird bei einem Vergleich nicht berücksichtigt.
    databaseDescription.addTableDescription("NOTES", "ID")
        .addExcludedColumns("UPDATE_DATE");
  }
}


Dem Interface DatabaseDescriptionCallback wird die Klasse DatabaseDescription übergeben, um dort alle Informationen zur Datenbankstruktur zu speichern. Das Interface ist als Callback realisiert, um den Erzeugungszeitpunkt der Datenbankbeschreibung in checkerberry db verwalten zu können. Jede Test-Methode verwendet eine eigene Instanz der Datenbankbeschreibung, sodass das Callback vor der Durchführung jeder Testmethode aufgerufen wird. Innerhalb des Callbacks werden Informationen zu allen Datenbanktabellen angegeben, deren Inhalt durch checkerberry db geprüft werden soll. Die wichtigste Angabe ist die Definition der Lookup-Keys für jede Tabelle. Anhand der Lookup-Keys kann checkerberry db eine Zuordnung zwischen Testdaten und den Daten der Datenbank herstellen.

Neben den Lookup-Keys kann für jede Datenbanktabelle eine Liste von Spaltennamen angegeben werden, die bei dem Vergleich von Testdaten mit den Daten der Datenbank nicht berücksichtigt werden. Es handelt sich dabei in der Regel um dynamische und/oder technische Informationen wie z.B. technische Zeitstempel, die den Änderungszeitpunkt eines Datensatzes anzeigen.

Des Weiteren ist die Markierung einer Datenbanktabelle als cacheable möglich. Im Gegensatz zu den Lookup Keys und den „Excluded Columns“ kann die Caching-Eigenschaft nur in dem Callback-Interface gesteuert werden. Die Modifikation in einer Testmethode ist für die Caching-Eigenschaft nicht möglich. Da die Caching-Eigenschaft bereits in der Setup-Phase, also vor der Durchführung einer Testmethode ausgewertet wird, hat die Modifikation in der Testmethode keine Auswirkungen auf die aktuelle Testmethode. Aus diesem Grund wird die Angabe der Caching-Eigenschaft nur in dem Callback-Interface erlaubt.

Es ist im Übrigen nicht erforderlich, sofort bei der Einbindung von checkerberry alle Tabellenbeschreibungen einzutragen. Es ist ausreichend, wenn man die Beschreibungen für die Tabellen definiert, die tatsächlich getestet werden. In der Praxis sieht es so aus, dass das Interface nach und nach implementiert wird.