6.11. PDF aus einer Datenbank lesen und testen

Ausgangssituation

Eine Anwendung stellt PDF-Dokumente in eine Datenbank ein.

Problem

Wie kann sichergestellt werden, dass das PDF-Dokument in der Datenbank den Erwartungen entspricht? Und wie wird der Test so geschrieben, dass der INSERT gegen die Datenbank beliebig oft funktioniert?

Lösungsansatz

Die Aufgabe, die Datenbank vor jedem Test zu bereinigen, damit ein INSERT immer funktioniert, wird mit DBUnit umgesetzt. Nachdem die Anwendung in die Datenbank geschrieben hat, wird mit JDBC ein InputStream erstellt, über den das PDF-Dokument aus der DB gelesen wird. Über diesen Stream liest PDFUnit das Dokument aus der Datenbank.

Lösung

/**
 * This tests validates a PDF document that a business program 
 * has stored as a BLOB into a database.
 */
@Test
public void verifyPDFDataFromDatabase() throws Exception {
  // Arrange:
  int userID = 4711;
  BusinessSystem myBusinessSystem = BusinessSystem.newInstance(userID);

  // Act:
  myBusinessSystem.doSomethingImportantAndWritePDFToDatabase();
  
  // Assert - compare the data of the DB with the data of the original file:
  String referencePdfName = myBusinessSystem.getPDFName();
  InputStream actualPdfFromDB = DBHelper.readPdfFromDB(userID);
  FileInputStream pdfReferenceFromFile = new FileInputStream(referencePdfName);

  AssertThat.document(actualPdfFromDB)
            .and(pdfReferenceFromFile)
            .haveSameText()
            .haveSameAppearance()
  ;

  actualPdfFromDB.close();
  pdfReferenceFromFile.close();
}

Dieses Beispiel funktioniert mit jeder JDBC-fähigen Datenbank. Das vollständige Programm ist im Demo-Projekt enhalten. Es kann über diesen Link (PDFUnit, Download) heruntergeladen werden kann.

Weitere Informationen zu DBUnit stehen auf der Projekt-Homepage.