2010-12-30 4 views
0

Ich bereite Unit-Tests für DAO-Layer vor, der mit Entitätsobjekten für die Persistenz in der Datenbank interagiert.Testen mit Hibernate: Objektabhängigkeitskette auf Persistenz

Technologie Hibernate Java 1.6 JUnit

Angenommen, ich will Prüfverfahren addEntityA()

dafür schaffen, so erstellen i Entität Objekt. Jetzt ist das Problem EntityA ist Kind von EntityB. Also muss ich den Verweis von EntityB in EntityA angeben. EntityA wird nur dann in der Datenbank beibehalten, wenn EntityB zuerst beibehalten wird. Um die Persistenz von EntityA zu testen, werde ich Testpersistenz von EntityB haben. Auf diese Weise kann es zu einer Kette von Entitäten kommen, die vor dem tatsächlichen Fortbestehen von EntityA zum Testen bestehen müssen. Man könnte argumentieren, dass ich einen Verweis auf EntityB-Objekt geben sollte, das bereits beibehalten wurde. Aber das Problem ist, dass ich Testfälle nicht vom Testen in der Datenbank abhängig machen möchte, sondern von Testdaten. Einige, wie ich mit dem, was JMock löst, aber nicht sicher, wie und ob Jmock kann hier nützlich sein?

Bitte lassen Sie mich wissen, wenn das Problem nicht klar ist?

Antwort

2

Nicht sicher, was Ihre eigentliche Frage ist, aber imo der beste Ansatz zum Testen der Hibernate/JPA-Funktionalität ist die Verwendung einer In-Memory-Datenbank und eine anständige Test-Kabelbaum. Mit Test-Harness meine ich eine Basisklasse für Ihre persistenzbezogenen Klassen, die Ihre In-Memory-Datenbank pro Test erstellen und löschen (vielleicht nur pro Testklasse). Die Testumgebung sollte auch Zugriff auf den Entitätsmanager oder die Sitzung bieten, die Sie während des Tests verwenden. Wenn Sie Filter für Ihre Konfigurationsdateien verwenden, können Sie Eigenschaften verwenden, um Datenbanken zu wechseln, um auch mit "echten" Datenbanken zu testen. Wenn Ihr Test von EntityA einen EntityB benötigt, müssen Sie EntityB in der Testkonfiguration oder im Test selbst erstellen. Werfen Sie einen Blick auf die Testumgebung von Hibernate Core, um sich ein Bild davon zu machen, wie Tests dort durchgeführt werden.

1

Teilen Sie das Problem in zwei. Lassen Sie Ihren Produktionscode von einer sauberen Oberfläche abhängig, die Sie nach Belieben spotten können. Und dann implementieren Sie diese Schnittstelle mit einer Schicht, die mit der Datenbank spricht. Testen Sie den Layer mit einer Instanz der echten Datenbank, da Hibernate-Fehler häufiger mit den Zuordnungen als mit dem Code zu tun haben. Suchen Sie nach "Ports and Adapters Architecture" für weitere Ideen.

Verwandte Themen