2013-06-19 6 views
5

Ich frage mich nur, was ist der beste Weg, JDBC-bezogene Methoden zu testen? Wie Benutzer hinzufügen, Benutzer zu verbieten, usw.Testen von JDBC-Abfragen in JUnit

(mit JUnit)

Sollte ich alle meine Leere Methoden booleans gesetzt und sie haben return true, wenn sie gearbeitet haben, falsch, wenn sie es nicht taten, und setze diese Werte in meinen JUnit-Tests entsprechend um?

Dies ist nur eine allgemeine Frage, um die Best Practices zu finden.

Vielen Dank!

+0

Generell rate ich, dass dies ein Integrationstest ist. Verwenden Sie eine In-Memory-Datenbank wie H2 anstelle Ihrer regulären Datenbank und bestätigen Sie, dass nach dem Aufruf Ihrer DAO-Methoden die Tabellen die erwarteten Zeilen enthalten. –

Antwort

7

ich persönlich ein tolles Werkzeug dafür ist Mockito finden. Sie können sich darüber lustig machen, was eine JDBC-Rückgabe Ihnen geben würde, also können Sie sagen, dass Sie bei einer bestimmten Abfrage und einem bestimmten Parameter einen bestimmten Wert zurückbekommen.

Sie sollten Ihren Code nicht ändern müssen, um es mit Unit-Tests funktioniert, sollte es sowohl arbeiten in der Produktion und Test genau die gleiche Weise.

Sie könnten auch zu Beginn der Testphase unter Verwendung einer In-Memory-Datenbank wie Derby und Belastungswerte berücksichtigen, so dass Sie die Werte kennen, die in ihm existieren. Mocking wäre wahrscheinlich schneller, wenn es um die Ausführungszeit geht.

+0

Okay, ich werde Mockito ausprobieren, danke! – user2297666

+0

Wenn Sie dies tun, werden Sie nicht Ihren Datenbankcode testen - Sie werden alle Dinge testen, die von Ihrem Datenbankcode abhängen, aber nicht den eigentlichen DB-Code selbst.Wollen Sie das tun? – DaveH

1

Der Zugriff auf die Datenbank in einem Komponententest ist im Allgemeinen keine gute Idee. Ich denke, es wäre besser, die Datenbankverbindung zu verspotten und zu überprüfen, ob die richtigen Abfragen aufgerufen werden. Das beinhaltet natürlich nicht den Fall, dass sich die Datenbank geändert hat und die Abfragen nicht mehr funktionieren, aber das passiert normalerweise sehr selten.

1

Ich denke, sehr einfache CRUD-Methoden müssen nicht durch Unit-Test getestet werden. Führen Sie einfach die Methode aus und überprüfen Sie die Tabelle. Der komplexeste Test umfasst grundlegende CRUD-Operationen.

Aber ich habe bereits Code, in dem Anlegen/Finden Betrieb in einem Verfahren getestet wird, sowohl wie ein Integrationstest. Das Ergebnis von find wird dann mit der Erstellungsanforderung verglichen.

EDIT: Sie können auch sehen DB Unit

2

Wenn ich Tests wie dies schreibe ich an die tatsächliche Datenbank anfügen, dass ich gegen aktiv sein (statt einer In-Memory-Datenbank). Ein großer Teil meines Code verwendet Verfahren oder eine andere Datenbank spezifische Funktionen gespeichert, die nicht unbedingt von Derby unterstützt wird usw.

Ob diese Einheit oder Integrationstests, weiß ich nicht. Aber sie sind wichtig, also bevorzuge ich sie in den Continuous Integration-Zyklus eingebaut zu bekommen.

Wenn Sie eine persistente Datenbank verwenden Sie dann tun Sie ein paar zusätzliche Dinge zu kümmern. Sie müssen den Status der Daten kennen, bevor Ihre Tests ausgeführt werden, und Sie sollten alles tun, um es bei jedem Test wieder in den bekannten Status zu versetzen. Wenn Sie dies nicht tun, sind Ihre Tests nicht unabhängig voneinander und Sie werden feststellen, dass Tests später in der Suite aufgrund von Fehlern in früheren Tests fehlschlagen.