DAO - Mock Objekte

Status
Nicht offen für weitere Antworten.

kama

Top Contributor
Hallo,

ich habe da mal eine Frage Unit Tests und Mock Objekte betreffend.

Ich habe ein DAO mit entsprechenden Methoden, die aus einer Datenbank entsprechende Ergebenisse liefern.

Jetzt möchte ich einen Unit Test schreiben, der OHNE die Datenbank funktioniert.
Meine Vorstellung ist jetzt, die DAO Schicht mit einer Mock Schicht zu ersetzten und fixe ergebnisse zu liefern...

Die Frage ist, gibt es eine sinnvollere/geschicktere Vorgehensweise so etwas zu realiseren.

Es stellt sich auch für mich die Frage, wie man so etwas im Rahmen eines Builds (Ich nutze Maven 2) realisert ?

Bin für alle Hinweise etc. Dankbar...

MfG
Karl Heinz Marbaise
 
M

maki

Gast
Ich nutze JMock, andere bevorzugen EasyMock, imho besser als eigene Mocks schreiben.

Alternativen wären zB. DBUnit, zwar ist die DB ist dann immer noch Teil des Tests, aber man weiss vorher ganz genau welche Daten Drinnen sind, inkl. IDs.
 

foobar

Top Contributor
Wenn dein DAO JPA/Hibernate verwendet kannste nach dem Test einfach ein Rollback machen, dann wird nichts persistiert und du hast immer einen konsistenten Datenbestand.
Ansonsten bietet es sich auch an Unittests in Groovy zu schreiben. Das ist wesentlicher einfacher als sich mit JMock und EasyMock rum zu ärgern.
 
M

maki

Gast
foobar hat gesagt.:
Wenn dein DAO JPA/Hibernate verwendet kannste nach dem Test einfach ein Rollback machen, dann wird nichts persistiert und du hast immer einen konsistenten Datenbestand.
Wenn die Transaktion durch ist, funzt kein Rollback mehr.
Wenn die Transaktion vorher abgebrochen wird und ein Rollback durchgeführt wird, hat man die Transaktion nicht getestet.

Ansonsten bietet es sich auch an Unittests in Groovy zu schreiben. Das ist wesentlicher einfacher als sich mit JMock und EasyMock rum zu ärgern.
Hab mich noch nie mit JMock geärgert, aber ob eine neue Sprache bzw. eine mehr im Projekt die bessere Lösung ist?
 

kama

Top Contributor
Hallo,

zuerst einmal vielen dank für die schnellen Antworten....

Weiterhin muss ich sagen, dass ich dbUnit schon in anderen Bereichen einsetze, aber für diesen fall nichts ist, da ich hier explizit das Problem habe, dass die DB noch nicht vorhanden ist bzw. noch nicht mit sinnvollen werten gefüllt ist und ich zuerst einmal eine einfache Lösung in Form der Mocks überlegt habe, damit ich nicht den ganzen hantier mit Datenbank aufsetzen etc. mach muss...(ja auch embedded etc. oder h2 etc. wäre auch möglich; aber die muss ich ja auch initialisieren (DDL))....Derzeit bin ich halt in der Phase, dass ich noch keine Nutzbare DB habe, aber schon einiges fertig machen kann und muss....

Also die Hinweise zu easyMock und jMock waren schon sehr hilfreich.....

Die Frage zu Groovy wäre, würde mich das von der Problematik des ersetzens einer Schicht (in diesem Falle DAO) entbinden ? Ich vermute nicht....

Die Nächste Frage, die sich aus der Nutzung von xxxMock ergibt ist die, ob das im Zusammenhang mit einem Multimodule Projekt in Maven auch sinnvoll Nutzbar ist....

Code:
  root
    +--- DAO
    +--- WS
    +--- ...
Jetzt müsste ich für einen Test Teile des DAO's durch Mock's ersetzten so dass der Aufruf aus WS den DAO nutzt.. ?
Geht das bzw. hat das schon mal einer gemacht ?

Also es läuft im Endeffekt darauf hinaus, dass ich über die DAO's Daten liefern will, die aber aus eigener Quelle liefern will (Hard Coded für den Test), damit weiter oben liegende Schichten schon mal Testen kann.....

Vielen Dank.

MfG
Karl Heinz Marbaise
 

byte

Top Contributor
maki hat gesagt.:
foobar hat gesagt.:
Wenn dein DAO JPA/Hibernate verwendet kannste nach dem Test einfach ein Rollback machen, dann wird nichts persistiert und du hast immer einen konsistenten Datenbestand.
Wenn die Transaktion durch ist, funzt kein Rollback mehr.
Wenn die Transaktion vorher abgebrochen wird und ein Rollback durchgeführt wird, hat man die Transaktion nicht getestet.

Wir machen das genauso wie foobar beschrieben hat. Und mit Spring ist das auch denkbar einfach:

Code:
@TransactionConfiguration(defaultRollback=true)

Was ist schlecht daran? Immernoch besser, also mit Mock-Objekten die DB gar nicht zu testen, oder?


Jetzt müsste ich für einen Test Teile des DAO's durch Mock's ersetzten so dass der Aufruf aus WS den DAO nutzt.. ?
Geht das bzw. hat das schon mal einer gemacht ?
Spätestens hier ist Dependency Injection sehr sinnvoll. Du könntest dann einfach per Konfiguration die richtigen DAOs gegen Mock-Implementierungen austauschen, ohne den Code anzufassen.
 
M

maki

Gast
Jetzt müsste ich für einen Test Teile des DAO's durch Mock's ersetzten so dass der Aufruf aus WS den DAO nutzt.. ?
Geht das bzw. hat das schon mal einer gemacht ?
Hab letztens einen Artikel in der JavaSpektrum (nicht sicher ob die so heisst) gelesen, in dem das gezeigt wird, aber mit TestNG.
Im Prinzip werden unterschiedliche Initialisierungsmethoden für die Tests aufgerufen.

Was ist schlecht daran? Immernoch besser, also mit Mock-Objekten die DB gar nicht zu testen, oder?
Ja, foobar hat natürlich recht, hab ignoriert das die DB nicht getestet werden soll.

Allerdings haben Mockobjekte einige Vorteile, sie helfen bei Unittests enorm, egal ob DAOs oder andere Klassen getestet werden.
u.a. kann ich mit Mockobjekten sicherstellen, das Methoden aufgerufen werden und wie oft, auch sind sie wichtig um die Tests etc. unabhängig von einander und normalen Klassen zu haben, helfen bei der sog. "Interface Discovery" für TDD.

EasyMock und JMock beinflussen nicht den Buildprocess, egal ob von Maven ode Ant.

Ein Wort noch zu JMock, JMock1 war EasyMock unterlegen, deswegen lesen sich die Berichte alle zum Vorteil von EasyMock, ist aber spätesten mit JMock2 schon nicht mehr der Fall.
 

kama

Top Contributor
Hallo,

erstmal vielen Dank für die Hinweise und Tipps....

maki hat gesagt.:
Hab letztens einen Artikel in der JavaSpektrum (nicht sicher ob die so heisst) gelesen, in dem das gezeigt wird, aber mit TestNG. Im Prinzip werden unterschiedliche Initialisierungsmethoden für die Tests aufgerufen.
Könntest Du mal genau nachschauen wie das Teil heißt, da ich sowieso schon mit TestNG arbeite wäre das recht interessant?

maki hat gesagt.:
EasyMock und JMock beinflussen nicht den Buildprocess, egal ob von Maven ode Ant.
Das Problem dabei ist, dass mein derzeitiger Build Prozess mit Maven schon eine ganze Menge sachen macht....Ich habe einen Integrations-Test, der ein WAR erzeugt, dass wird einen Tomcat deployed und dann dagegen Tests laufen läßt. Das bedeutet, dass hier schon sehr nah an der Wirklichkeit getestet wird....
Genau dass müsste ich jetzt ändern, damit die bisherigen Vorschläge realisert werden könnten....Somit ändert sich der Build Prozess garantiert....

byto hat gesagt.:
Spätestens hier ist Dependency Injection sehr sinnvoll. Du könntest dann einfach per Konfiguration die richtigen DAOs gegen Mock-Implementierungen austauschen, ohne den Code anzufassen.
Ok. Das heißt mein bisheriges Design war nicht gut genug. Das muss ich also ändern, damit ich dann diese Änderung machen kann und eben das Gewünschte erreichen kann.....Wieder was gelernt...

MfG
Karl Heinz Marbaise
 

foobar

Top Contributor
maki hat gesagt.:
Ansonsten bietet es sich auch an Unittests in Groovy zu schreiben. Das ist wesentlicher einfacher als sich mit JMock und EasyMock rum zu ärgern.
Hab mich noch nie mit JMock geärgert, aber ob eine neue Sprache bzw. eine mehr im Projekt die bessere Lösung ist?

Mit ärgern meinte ich viel mehr die ziemlich schlecht lesbaren Mock-klassen. In Groovy gibt es eine native Syntax für Listen und Maps zusätzlich noch Closures. Damit kann man sich schnell eine beliebige Klasse erstellen Duck-Typing sei dank.

BTW im aktuellen Eclipsemagazin gibt es mehrere Artikel zum Thema Junit und JMock/Easymock.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Equals Mock Objekte Allgemeine Java-Themen 5
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
B FileWriter / FileReader testen / Mock-Objekt für Unit Tests? Allgemeine Java-Themen 6
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
E OOP Objekte und Methoden Allgemeine Java-Themen 1
@SupressWarnings() Umgebungsvariable Objekte "gekoppelt" Allgemeine Java-Themen 6
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
OnDemand Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
H Objekte Serialisiert speichern Allgemeine Java-Themen 10
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
R Input/Output Objekte speichern ohne überschreiben Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
H COM-Objekte/ AktiveX Objekte Allgemeine Java-Themen 4
C Script für Website mit Objekte Ausblenden Allgemeine Java-Themen 3
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
F Referenzen auf Objekte Allgemeine Java-Themen 5
H Eclipse und Objekte Allgemeine Java-Themen 6
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
N Dynamische Objekte / DB Allgemeine Java-Themen 5
J Objekte binär speichern Allgemeine Java-Themen 10
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
V Objekte in Kategorien einteilen. Allgemeine Java-Themen 6
M 3D Objekte mit einer Linie Verbinden Allgemeine Java-Themen 3
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
W Objekte speichern mit JFileChooser Allgemeine Java-Themen 8
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
L Objekte in Liste packen Allgemeine Java-Themen 2
S XML in Objekte wandeln. Euer Rat? Allgemeine Java-Themen 12
G Objekte serialisieren Allgemeine Java-Themen 2
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
S Objekte mit Arrays Allgemeine Java-Themen 9
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S erzeugte objekte zählen Allgemeine Java-Themen 3
U auf Objekte mit variablem Namen zugreifen Allgemeine Java-Themen 4
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
J Speicherbedarf und persistente Objekte Allgemeine Java-Themen 4
J ArrayList Objekte anhand Propertywerte filtern Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben