Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern

Maik.Neumann

Aktives Mitglied
Juten Tach noch mal,

Ich schreibe gerade ein paar JUnit Tests für meinen Applikationscode. Hierbei werden JPA Entities erzeugt und mittels setter mit daten befüllt. Anschließend werden diese in die Datenbank geschrieben und auch wieder ausgelesen.

Nun stellt sich für mich die Frage, wie ich am besten solche Junit Tests umsetzen kann, ohne tatsächlich in einer reale datenbank hineinschreiben zu müssen und später auch wieder aus dieser auslesen zu müssen.

Muss ich hierzu schon tatsächlich ein Mocking Framework verwenden? Oder gibt es da vielleicht noch andere Möglichkeiten, um ein solches "Schreiben" und "lesen" in / aus einer Datenbank zu simulieren?

Maik
 
Das kommt darauf an mit welchen Frameworks du "unterwegs" bist.

Zuerst muss ich sagen, das dein Code "agnostisch" sein sollte, gegenüber welche DB und ob überhaupt eine DB eingesetzt wird.

Beispielsweise sollte der Code der einen Eintrag "in die DB" einträgt, nicht wissen, ob darunter eine DB liegt. Daher kannst du dann den Code auch in-Memory testen.

Irgendwann aber möchtest du AUCH testen, ob DB-spezifische Teile funktionieren.

Hier kann bei einigen Frameworks eingestellt werden,das nach einem Test ein Rollback auf die Transaktion gemacht wird. Bei Spring gibt es dafür wohl die Annotation @Rollback.

Einige DB können ebenfalls konfiguriert werden, das nur Lesezugriffe möglich sind.
Andere Möglichkeit: Du kannst selber beim teardown() einen Rollback machen.

Und schließlich kannst du die DB vor jedem Test in einen konsistenten Zustand bringen und Tabellen/Daten anlegen oder Dump einspielen. Dieses Vorgehen legt nahe, das dies zeitaufwändiger ist, als andere Schritte. Daher ist es wichtig zu wissen, das einige Tests VORHER bereits ordentlich liefen beispielsweise die in-memory Tests. Sind also aus meiner Sicht mehr Integration-Tests, denn jUnit-Tests.
 
Was genau bedeutet in-Memory?
Das du gar keine DB benutzt, sondern alles intern im Speicher machst.

Damit sollte es möglich sein, einige Tests durchzuführen, z.B. Einfügen ohne in die DB zu schreiben, weil es ausreicht zu wissen, das beispielsweise die Liste der Records sich um einen Record erhöht hat. Oder Suchen von Records geht auch auf einer internen Liste und es braucht keine richtige DB (im Hintergrund).

Für andere Tests nehme ich auch keine große Oracle-DB, sondern eine kleinere, beispielsweise H2. Viele, derartige Embedded-DB, speichern ihre Daten in einer normalen Datei. Also ist das Aufsetzen einer Test-DB recht einfach und besteht lediglich in der Kopie der "Original-DB"-Datei.
 

Zurück
Oben