2012-03-30 5 views
4

Ich möchte meine Klasse MyTypeDAO mit Hibernate 4.1 mit JUnit 4.9 implementiert testen. Ich habe die folgende Frage:DAO-Test: der richtige Weg?

In meiner DAO habe ich eine findById-Methode, die eine Instanz meines Typs durch seine ID abrufen. Wie testet man diese Methode?

Was ich getan habe:

  1. ich eine Instanz meiner Art erstellen.
  2. Dann muss ich diese Instanz persistieren, aber wie? Kann ich mich auf meine saveMyType-Methode verlassen? Ich denke nicht, da ich im Testfall bin und diese Methode nicht getestet wird.
  3. Dann brauche ich die findById Methode mit der ID der Instanz in Schritt erstellt anrufen 1.
  4. Schließlich prüfe ich, dass die Instanz in Schritt 1 erstellt ist gleich dem, den ich in Schritt erhalten 3.

Irgendeine Idee? Was sind die besten Praktiken?

Ich habe die gleichen Fragen für die Speichermethode, da nach dem Ausführen, muss ich die Sicherungsinstanz abrufen. Auch hier glaube ich nicht, dass ich mich auf meine findById-Methode verlassen kann, da sie noch nicht getestet wurde.

Dank

Antwort

4

Ein möglicher Weg ist:

einen db im Speicher erstellen für die Prüfung, Last Inhalt dieser db aus einem vordefinierten SQL-Skript andthen testen Sie Ihre DAO-Klassen gegen diese Datenbank.

Jedes Mal, wenn Sie Tests starten, wird die Datenbank von Grund auf mit dem SQL-Skript erstellt und Sie werden wissen, welche ID ein Ergebnis zurückgeben soll und welche nicht.

See [DbUnit][1] (von satoshi Kommentar)

+1

+1 ... Auch DbUnit vereinfacht diese Aufgabe erheblich, sehen Sie es sich an. – satoshi

+1

ein weiterer +1 für dbUnit. Wenn Sie es jedoch verwenden, verwenden Sie die Funktion zum Exportieren nach XML. Auf diese Weise können Sie alle Ihre Tabellen bearbeiten und dann das XML erstellen: spart viel Zeit. –

1

Ich glaube nicht, dass Sie viel Wahl, dies zu erreichen haben. Es ist keine gute Praxis, orthogonale Tests zu haben (Tests, die 2 Dinge testen oder abhängig sind). Trotzdem sollten Sie diese Ausnahme wirklich als gültig und schnell betrachten. Sie haben Recht: Ein Objekt zu erhalten und es wiederzuerlangen, ist eine gute Idee, diese Dao-Schicht zu testen.

Andere Optionen umfassen einen Datensatz, über den Sie sich sicher sind, und den Abruf (findById) auf der Datenbank. Und der zweite Test, um ein Objekt zu erhalten und es die Teardown-Methode zu entfernen.

Aber wirklich, es wäre einfacher, Laden und Speichern zusammen zu testen, und es macht viel Sinn.

+0

Es scheint, dass ich nicht zu orthogonalen Tests gezwungen bin. Zum Beispiel bietet DBUnit die Möglichkeit, Daten von der Datenbank abzurufen, so dass ich davon ausgehen kann, dass der DBUnit-Code getestet wurde und dass ich mit DBUnit tatsächlich die Daten in der Datenbank erhalte. Was denken Sie? –