Hibernate -> Probleme bei n:m-Relation und JUnit

PHANTOMIAS

Aktives Mitglied
Hallo an alle!

Ich habe eine Adobe Flex <- BlazeDS -> J2EE Anwendung mit einer Hibernate / MySQL Anbindung.

Nun habe ich zwei Tabellen: Projekt und Benutzer, die n:m in einer Zwischentabelle verknüpft sind: Projekt_Benutzer mit projektId und benutzerId.

In der Klasse Projekt ist eine List von benutzern, in der Klasse Person eine Liste von Projekten mit entsprechenden getter/setter-Methoden. Ich habe also eine bidirektionale Verbindung.

Nun habe ich aber zwei "Probleme":
  1. Wie füge ich einen Benutzer einem Projekt hinzu? Schreibe ich dafür bei der Schnittstelle des Benutzers eine Methode addBenutzerToProject(Benutzer benutzer, int projektId)? Oder mace ich das in dem ich derArrayList von Projekten beim Benutzer eine add-Methode aufnehme auf Seiten des Frontend und ich dann ein updateBenutzer() aufrufe? Ich hoffe ihr versteht was ich meine... Und da ich das bidirektional habe, kann ich ja auch das Gleiche auf Seiten des Projekts machen. Da ist auch eine Liste von Benutzern, die müsste ich erweitern und dann das Projekt updaten. Wie geht man da i.A. vor?
  2. Ich schreibe JUnit-Tests. Nun habe ich je eine Schnittstelle für Projekt und Benutzer mit den Methoden: add, update, remove, getAll, findById. Nun kann ich diese mit einer JUnit-Testklasse ausführen lassen in der Art:

    Java:
    IBenutzerService s = new BenutzerServiceImplementierung();
    @Test
    public void testAddBenutzer() {
        testRemoveBenutzer();
        for (int i=0; i < 5; i++) {
            Benutzer b = new Benutzer();
            // setter-Methoden
            s.addBenutzer(b);
        }
    }
    // oder andere Methoden mit assertEquals-Abfrage..
    So habe ich für eine Klasse, eine JUnit-Klasse. Wie kann ich denn aber nun die Zwischentabelle "Projekt_Benutzer" testen lassen? Dann muss ich ja erst Projekte anlegen lassen, und dann Benutzer, und die dann verbinden. Schreibe ich dann eine JUnit-Klasse, die dann beide Interface-Services verbindet? Oder rufe ich die Test-Methoden aus beiden Testklassen auf?
Ich hoffe jemand kann mir dazu etwas sagen, da ich daran hänge und ich nicht weiß wie ich das am Besten tun soll.

Danke + Gruß PHANTOMIAS
 
M

maki

Gast
Dein Test ist schlecht, weil er von anderen Tests abhängt, sieh dir mal DBUnit an.

Wie du Benutzer speichern möchtest solltest du eigentlich wissen ;)
 

PHANTOMIAS

Aktives Mitglied
Über DBUnit bin ich auch schon gestolpert, nur ist mir unklar, jetzt mal unabhängig von einer Datenbank, wie ich Unit-Tests schreibe, die sich nicht untereinander "helfen"?

Ich meine bei mir ist es nicht allzu problematisch, da ich die DB jedes Mal neu aufsetze und läuft was schief, dann läuft was schief; ich korrigiere es, bis es durchläuft :)

DBUnit bringt dann vorm Testlauf die DB auf einen bestimmten Stand, richtig? Also bspw. beim Anlegen von neuen Benutzern, statt meine testRemoveBenutzer() aufzurufen setzt er die DB so, dass keine Benutzer in der Tabelle enthalten sind, richtig? So baue ich dann nicht auf diese andere test-Methode auf.

Ja, ich denke ich füge die Projekte zu den Benutzern im Frontend zu und biete da eine Methode um den Benutzer das Projekt hinzuzufügen lassen. Und dann kann ich ja ein updateBenutzer() anstoßen, dann wird das ja automatisch mit gesetzt, oder? Ich mache da ein "session.update(benutzer)" in der Hibernate Implementierungsklasse des Benutzers.

Aber wie schreibe ich dann nach JUnit-Manier (mal unabhängig vom Aufbau auf andere Tests) den Test dass ich ein Projekt anlege, dann einen Benutzer und diese dann verbinden lasse?
Lege ich da eine ProjektBenutzerTest-Klasse an, instanziiere beide Service-Implementierungen? Aber ich wähle doch immer nur eine Klasse aus, die getestet werden soll und kann da dann mit meineMethode() testMeineMethode() notieren lassen. Bin da etwas verwirrt wie ich also klassenübergreifend testen lasse...

Danke + Gruß PHANTOMIAS
 
M

maki

Gast
Über DBUnit bin ich auch schon gestolpert, nur ist mir unklar, jetzt mal unabhängig von einer Datenbank, wie ich Unit-Tests schreibe, die sich nicht untereinander "helfen"?
Die Antwort hast du dir schon selber gegeben:
DBUnit bringt dann vorm Testlauf die DB auf einen bestimmten Stand, richtig? Also bspw. beim Anlegen von neuen Benutzern, statt meine testRemoveBenutzer() aufzurufen setzt er die DB so, dass keine Benutzer in der Tabelle enthalten sind, richtig? So baue ich dann nicht auf diese andere test-Methode auf.

Ich meine bei mir ist es nicht allzu problematisch, da ich die DB jedes Mal neu aufsetze und läuft was schief, dann läuft was schief; ich korrigiere es, bis es durchläuft
Da täuscht du dich, Grundregel für Tests: Keine Abhängigkeiten/Interaktion zwischen tests.
Im Prinzip könnte sogar jeder einzelne Test die DB neu aufsetzen...

Aber wie schreibe ich dann nach JUnit-Manier (mal unabhängig vom Aufbau auf andere Tests) den Test dass ich ein Projekt anlege, dann einen Benutzer und diese dann verbinden lasse?
Lege ich da eine ProjektBenutzerTest-Klasse an, instanziiere beide Service-Implementierungen? Aber ich wähle doch immer nur eine Klasse aus, die getestet werden soll und kann da dann mit meineMethode() testMeineMethode() notieren lassen. Bin da etwas verwirrt wie ich also klassenübergreifend testen lasse...
Solltest dir immer genau darüber bewust sein, was du testen willst.
Was meinst du mit"Klassenübergreifend"?
Willst du isolierte Unittestests (also ohne echte DB), oder Integrationstests (mit DB), oder gar Akzeptanztests(ganze Abläufe)?
Die Komplexität steigt übrigens in dieser Reihenfolge an, und zwar deutlich ;)
 

PHANTOMIAS

Aktives Mitglied
Hmm, du merkst, ich bin noch test-unerfahren. Ich muss das Testen erst testen :)

Aber eigentlich hätte ich gerne in meinem Fall eigentlich gern den folgenden Ablauf des Tests:
  • add 10 Benutzer
  • update die ersten fünf Benutzer
  • remove 2-3 Benutzer
  • getAll Benutzer
  • findBenutzerById
-> So bräuchte ich doch keinen Aufbau auf andere Test-Methoden?! Also ich rufe zumindest mal in keiner Testmethode eine andere Testmethode auf.

Integrationstests mache ich ja zur Zeit mit der Datenbank. Ja, was ich gerne möchte ist wohl ein Akzeptanztest (bin noch nicht 100%ig mit den Begrifflichkeiten vertraut). Also ich will gerne simulieren:
Anlage eines Projekts, Anlage eines Benutzers, Verbinden Projekt<->Benutzer.
Bedeutet: Erst addProjekt(), dann addBenutzer(), und dann der Test einmal auf der Seite des Projekts, in dem ich die Liste von Benutzer erweitere, und das andere Mal (zweiter Test), dass ich bei den Benutzern, die Liste der Projekte erweitere. Und dann ein update() auf Projekt bzw. Benutzer.
Und das sollte ich ja dann in der Datenbank in der Zwischentabelle Projekt_Benutzer sehen können?!

Gruß PHANTOMIAS
 
M

maki

Gast
Solltest dir wirklich, wirklich im klaren sein was du testen willst ;)

Alles auf einmal testen ist komplex, und schlecht für die Defektlokalisierung, und meist auch langsam ;)

Würde an deiner Stelle langsam anfangen, teste mal isolierte Einheiten(Unittests), ohne DB, lerne Mockobjekte nutzen usw.
 

PHANTOMIAS

Aktives Mitglied
So viele Defekte kann ich gar nicht haben, das ist nur ein Testprojekt mit 3 Datenbanktabellen und insgesamt 12 Spalten. Es geht mir nur darum mit Hibernate umgehen zu lernen und mit Testen.

Also ich habe wirklich ein kleines System. Das mit Projekt und Benutzer ist schon das absolute Highlight mit n:m. Die andere Relation ist noch 1:n zum Testen, das wars. Außer getter/setter habe ich auch nichts in den Klassen. Und getter/setter teste ich wohl eher nicht. Somit habe ich keine reinen Unittests durchzuführen, nur in Kombination mit der Datenbank. Und bisher bin ich eigentlich zufrieden: Datenbank wird korrekt angelegt und ich kann einzeln testen. DBUnit schaue ich mir gleich noch näher an und versuche das zu integrieren, dass ich nicht andere Test-Methoden aufrufen muss.

Aber nur zu meinem Verständnis: wäre es kein workaround, dass ich die test-Methoden in einer bestimmten Reihenfolge aufrufe, wie im vorherigen Post von mir beschrieben? Dann bräuchte ich nicht innerhalb von Testmethoden auf andere Testmethoden zugreifen. Kann man nicht eine bestimmte Reihenfolge festlegen der Methoden wie sie aufgerufen werden?

Nun, aber wie tue ich denn nun diesen Akzeptanztest implementieren? Ich habe ja nur einen: Projekt anlegen, Benutzer anlegen, Projekt-Benutzer-Beziehung herstellen. Weitere sinnvolle Abläufe habe ich nicht in meinem Testprojekt, da der Rest nur setzen und holen ist.
Ich weiß nicht ob es dafür etwas übertrieben ist, mit Dummy-Objekten zu arbeiten?!

Gruß PHANTOMIAS
 
M

maki

Gast
Tests von einander abhängig zu machen ist nie eine gute Idee, bei Akzeptanstests allerdings macht man das oft so, dass eine TestSuite erstellt wird, die Testcases in einer bestimmten Reihenfolge luafen lässt.

Für alle anderen Arten von Tests gilt aber: Keine Abhängigkeiten zwischen Tests!

Nicht umsonst erstellen alle xUnit Frameworks (mit einer einzigen Ausnahme, der NUnit Author hat den Fehler eingesehen sich dafür entschuldigt) erstellen für jede Testmethode (=TestCase) eine eigene Instanz der Testklasse.

Ich denke du würdest dich übernehmen wenn du in diesem Stadium Integrationstests schreibst, lernen würdest du nix sinnvolles/vernünftiges imho, ausser höchstens Hacks/Workarounds/schlechte Angewohnheiten.

Nebenbei, Mocks sind keine Dummys: Mocks Aren't Stubs

Mocks gehören übrigens zur Standardausrüstung für isolierte Unittests, dass sind die Tests die du zuerst lernen solltest.

Nachtrag: Wer schon mal mit abhängiggen tests zutun hatte, weiss worum es geht:
Mal gehen die Tests, mal nicht, dann gehen sie wieder, aber jedesmal mit einem anderen Fehler bzw. anderen test der fehlschlägt, und das alles ohne Änderungen am Code :D
 
Zuletzt bearbeitet von einem Moderator:

PHANTOMIAS

Aktives Mitglied
Okay-okay, dann höre ich wohl mal lieber auf dich :)

Zwei letzte Fragen:
  • Gibt es ein gutes Buch darüber wo man das von Grund auf lernen kann?
  • Ich schreibe zur Zeit immer einzelne Testklassen und führe die mit run as -> JUnit test aus. So muss ich jedesmal das einzeln für jede Klasse initiieren. Kann man das vereinen?
Und nun gehe ich mal zum DBUnit über...

Danke + Gruß PHANTOMIAS
 
M

maki

Gast
Bücher für den Einstieg kenne ich keine mehr, kann "XUnit Test Patters - Refactoring Test code" empfehlen, ist aber was für Fortgeschrittene.

Hier ein Besipiel für DBUnit von der XUnit Webseite (Example: Back Door Fixture Setup ) : Back Door Manipulation at XUnitPatterns.com

TestSuiten kann man sich dynamisch erstellen lassen, zB. von Ant, Maven2, Eclipse (letzteres hat ein Problem mit JUnit 4 Tests).
 

PHANTOMIAS

Aktives Mitglied
Okay, werde dann mal nach Literatur schauen...

Mist, Maven2 konnte ich nicht in mein kombiniertes Flex/Java-Projekt einbauen. Und Eclipse hat Probleme mit JUnit4, das ich nutze, das ist doof :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
J MySQL Hibernate: Probleme beim Speichern von OneToMany - Datensätzen Datenbankprogrammierung 2
klattiator Hibernate - Probleme bei Konfiguration Datenbankprogrammierung 3
F Probleme mit entfernter DB und Hibernate Zeichensatz Datenbankprogrammierung 3
ARadauer hibernate probleme Datenbankprogrammierung 13
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2
T Hibernate Division zweier Summen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben