2012-04-06 6 views
4

Ich denke, es ist üblich für Datenbank-Tests CRUD-Operationen zu enthalten. Diese Funktionen modifizieren also die Datenbank, wodurch sich die erwarteten Werte ändern: z. Wenn ich teste, dass ein SELECT 2 Zeilen zurückgibt, bekomme ich vielleicht einen Fehler, wenn ein Test zum Löschen zuerst ausgeführt wird. Ähnlich wie INSERT. JUnit scheint die Tests nicht so auszuführen, wie sie definiert sind, was die erwarteten Werte erschwert.JUnit Datenbank Test und Bestellung von Tests

Wenn ich meine Datenbank bei jedem Test neu initialisiert, ist es vielleicht übertrieben und langsam. Wie kann ich dieses Problem angehen?

Antwort

3

Ja, wie Steve Hall darauf hingewiesen hat, löst die Verwendung transaktionaler Tests das Problem der Datenbankkonsistenz zwischen Tests und Testläufen zu 100%. Spring bietet eine sehr aufwendige Unterstützung für diese Art von Tests (siehe transaction management in TestContext Framework), aber es ist nicht so schwierig, ohne sie zu implementieren.

Innerhalb von Transaktionstests, die ihre Transaktion am Ende zurücksetzen, können Sie beliebige CRUD-Vorgänge auf Ihre Daten anwenden, solange sie Teil der durch den Test initiierten Transaktion sind. Ein einzelner Rollback während des Testabbruchs beseitigt alle CRUD-Effekte in der Datenbank.

0

Ihre Komponententests sollten nicht von der Reihenfolge abhängig sein, aber für Tests auf Einheitenebene sollten Sie normalerweise keine echte Datenbank verwenden. Sie sollten die Datenbank mit etwas wie DBUnit verspotten oder, wenn Ihre Datenbank hinter einer Service-Layer-Schnittstelle verborgen ist, einen Mock dafür erstellen.

+0

Ich stimme @Jeff zu, dass, wenn Sie die Integration mit Ihrer Datenbank testen, Sie Ihre Datenzugriffsobjekte mit etwas wie Mockito verspotten sollten. – MarkOfHall

1

Sie möchten etwas wie DBUnit betrachten. Wenn dies nicht Ihren Anforderungen entspricht, können Sie versuchen, Ihre Tests in Datenbanktransaktionen zu verpacken. Mit den Methoden setup und teardown können Sie Ihre Transaktionen starten und zurücksetzen.