I hit a problem when writing tests for a database application using JPA2 and EclipseLink:
I add some entity to a database, retrieve it later and want to compare it to an instance which has the values I expect to confirm that the addition worked as I intended.
First I wrote something like
assertEquals(expResult, dbResult);
which failed, because I can’t really know the value of id field, which is generated by the database and therefore dbResult differs from expResult which I created with new and populated manually.
I see two options:
-
Either I remove the
idfield fromequalsandhashCodeso that the comparison is only based on the “real values”. I don’t know if this causes problems in the database or elsewhere, though. -
Or I write my tests to explicitly check every field except
idmanually.
What should I do?
You might find a lot of controversy about this one. My stance is that you absolutely don’t use a database primary key for anything in your application. It should be completely invisible. Identify your objects in your application by some other property or combination of properties.
On the “testing persistence operations” front, what you really want is probably to check that the fields were saved and loaded correctly and maybe that the primary key got assigned some value when you saved it. This probably isn’t a job for the equals method at all.