ich hab eine kleine Anwendung welche EclipseLink nutz. Dazu hab ich ein paar Test geschrieben.
Was muß ich denn in der persistence.xml als Property angeben das er mir vor jedem test in eine testklasse die Datenbank neu erstellt damit sie quasi vor jedem test leer ist?
Bei Hibernate geht das ja ganz gut mit
Ich nutze ne HSQL.
Und nein die Anwendung ist so klein, ich brauch da keine Testdaten.
Aber irgendwie scheint es so auch nicht wirklich zu funktionieren, das Problem liegt wohl doch wo anders.
Hier rauf bin ich nur gekommen weil Objekte mehrfach in der DB drin sind obwohl sie es nicht sein dürfen.
In einem Test erstell ich eine Objet vom Typ A und in einen anderen 4 Objekte vom Typ A um zu prfüen ob er sie auch fein alle läd aber am Ende kommen 5 raus und net wie angenommen 4, weil das erste sollte er ja so abräumen.
Der eigentlich Fehler ist dieser hier aber dazu werd ich wenn ich net selber drauf komme gleich hier nen thread erzeugen.
009-09-03 10:27:11,956] L=[INFO] C=[de.***.***.***.***.persist.DatabaseTestCase] M=[setup DatabaseTestCase]
[EL Warning]: 2009-09-03 10:27:12.157--UnitOfWork(1118816)--Exception [EclipseLink-7197] (Eclipse Persistence Services - 2.0.0.v20090821-r4934): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Null primary key encountered in unit of work clone
HSQL funzt nicht wirklich sauber mit Eclipselink, da braucht man mehrere Workarounds, bis hin wie man Unique Felder markiert, gibt da noch den einen oder anderen Bug, Derby ist ime besser zum testen von Eclipselink geeignet, aber auch langsamer.
Also was ich hier im Prinzip mache ist eine Anwendung von Hibernate auf EclipseLink zu portieren.
Beide laufen auf ner HSQL DB und die test von der Hibernate Sache sollen auch auf dem EclipseLink laufen, aber je mehr ich google Frage desto eher komm ich zu der Annahme das EclipseLink + HSQL = böse.
Was wäre denn besser zu nutzen, das Derby oder DBUnit?
DBUnit ist ein Framework für Unittests mit relationalen DBs, damit kann man zum Beispiel Testdaten einspielen vor den Tests und diese Testdaten danach wieder löschen, also allgemein gesagt kann man damit die DB in einen definierten Zustand setzen, ist ja nicht unwichtig beim Testen DBunit kann aber noch mehr...
Ich nutze DBUnit immer in meinen Tests, auch wenn es nicht immer ganz einfach ist es mit der jeweiligen DB zum zusammenspielen zu bringen, muss aber nur einmal gemacht werden, danach läuft alles, hier meine Anpassung für Derby mit DBUnit:
Java:
publicclassMyDerbyPlatformextendsDerbyPlatform{@OverridepublicvoidprintFieldIdentityClause(Writer writer)throwsValidationException{try{
writer.write(" GENERATED BY DEFAULT AS IDENTITY (START WITH 1000) ");}catch(IOException ioException){throwValidationException.fileError(ioException);}}}
DBUnit ist aber egal wenn du "nur" migrieren musst, dann musst du auch nix ändern an der DERBY target-database.
Derby ist imho eine gute Wahl für EclipseLink tests, man muss den "Database Dialect" (oder wie er bei EclipseLink heisst die target-database) etwas anpassen wenn man es mit DBUnit verwenden will, ist aber nicht wirklich nur ein ein paar Zeilen Code.
So also das sind die Properties von Derby in der persistence.xml
[xml]
<persistenceroperties>
<persistenceroperty name="javax.persistence.jdbc.driver"
value="org.apache.derby.jdbc.EmbeddedDriver" />
<persistenceroperty name="javax.persistence.jdbc.url"
value="jdbc:derby:target/data/derby_demo;create=true" />
<persistenceroperty name="javax.persistence.jdbc.user"
value="user" />
<persistenceroperty name="javax.persistence.jdbc.password"
value="password" />
<persistenceroperty name="eclipselink.ddl-generation"
value="drop-and-create-tables" />
<persistenceroperty name="eclipselink.ddl-generation.output-mode"
value="database" />
</persistenceroperties>
[/xml]
Und das ist die Testklasse:
Das manufacturerDao braucht imo für jeden Tests einen neuen EntityManger der von einer neuen EntityMangerFactory erzeugt wurde, wie kommt das Dao denn an den EM?
Nebenbei, ist zwar nicht dein Problem, aber nur dass ich es erwähnt hatte:
[c] manufacturerDao.persist[/c] wird mitgetestet, und falls es fehlschlägt, schlägt [c]manufacturerDao.loadByPk[/c] auch fehl, DBUnit verhindert das und der TEst würde kürzer ausfallen:
Für jeden Test einen neuen EMF und einen neuen EM.
Alternativ kannst du natürlich einen Rollback nach jedem Test machen, die Frage ist ob die Daten dann auch wirklich zur DB gesendet werden.