Warum schlägt JUnit-Test fehl?

Status
Nicht offen für weitere Antworten.

GilbertGrape

Bekanntes Mitglied
Hallo,

ich teste im Moment das persistieren einer meiner Klassen.

Dazu hab ich folgende Testmethode geschrieben:

Code:
public void testStoreRetrieve(){
		User user = new User("test");
		Long id = userDao.saveUser(user);
		
		User retrievedUser = userDao.getUser(id);
		assertEquals(user, retrievedUser);
		assertNotSame(user, retrievedUser);
	}

Ich hoffe, das reicht erstmal!
Denn das Problem ist, dass assertEquals fehl schlägt. Ich weiß nicht genau wie Equals hier vergleicht, aber ich hab im Debugger nachgeschaut und da sind die beiden Objekte für mich gleich. Das heißt, die id stimmt überein und der Name auch und die anderen Attribute sind null.
Ich kenn mich noch nicht besonders gut mit JUnit aus, aber ich hab schon ein bißchen was gelesen und so wurde es auch in einem Beispiel gemacht.
Vielleicht fällt jemandem was auf??

Gruß!
 
Es wird wohl "equals" aufgerufen, implementiert die Klasse "User" die Methode "boolean equals( Object )"?
 
Wer equals() überschreibt, muss auch hashcode() überschreiben.
Ansonsten fällt mir auf, dass du keine Unittest sondern einen Integrationtest machst, oder täusche ich mich da?
 
maki hat gesagt.:
Wer equals() überschreibt, muss auch hashcode() überschreiben.
kann ich mir die Berechnung des neuen Hashcodes ausdenken??

maki hat gesagt.:
Ansonsten fällt mir auf, dass du keine Unittest sondern einen Integrationtest machst, oder täusche ich mich da?
Du meinst, weil ich UserDao und User teste? Kann sein, aber ich wüsste nicht wie ich das trennen sollte...
 
kannst theoretisch ausdenken, ja,

recht schlau wäre es, den Hashcode von den Dingen abhängig zu machen, die du auch in equals benutzt,
z.B. name.hashCode() + id
 
Alles klar.

Ich hatte nur irgendwo so eine Funktion gefunden und wusste nicht wo jetzt die Zahlen (also die 1000003) herkommen:

Code:
public int hashCode(){
return name.hashCode() * 1000003 + prename.hashCode();
}
 
GG,

Bevor du deinen eigenen Murks fabrizierst:
in Eclipse
Rechtsklick auf die Source -> Source -> generate equals & hashcode

Dann nur noch die gewünschten Felder auswählen.
 
Zu spät! naja, auch nicht schlecht, das mal selbst zu machen. Fürs nächste Mal weiß ichs 🙂 Bei mir sahs auch fast genauso aus, nur dass ich nicht diese Primzahl benutzt habe bei HashCode.
Wozu wird das gemacht? Um die Codes besser zu verteilen?
 
GilbertGrape hat gesagt.:
Zu spät! naja, auch nicht schlecht, das mal selbst zu machen. Fürs nächste Mal weiß ichs 🙂 Bei mir sahs auch fast genauso aus, nur dass ich nicht diese Primzahl benutzt habe bei HashCode.
Wozu wird das gemacht? Um die Codes besser zu verteilen?
Was du selbst gemacht hast, kannste wegwerfen 😉
Was machst du denn wenn name oder prename (Was soll das eigentlich sein? 😉) null ist?

Ist komplizierter als du denkst, lies dich mal rein, so schwer ist es zwar nicht, aber einfach mal so aus der Hüfte ist sicherlich nicht der beste Weg.

http://www.geocities.com/technofundo/tech/java/equalhash.html

Dazu kommt, dass equals und hashcode bei Identitätsobjetken anders implmentiert werden sollte als bei Wertobjekten.
 
Hehe, das Beispiel war aus dem Internet. Das hatte ich nur wegen dieser Zahl gepostet.
Bei mir hatte ich die null-Abfragen drin 🙂

Edit: Und bei mir heißen die firstName und lastName 🙂
 
Na dann 😉

Andere Frage: Was passiert wenn zwei Benutzer denselben Namen haben?
 
das macht nix.
ich hab noch einen login, der soll unique sein. ich hab das einfach als UniqueConstraint hinzugefügt. nicht richtig?
 
Prüfst du denn auf denn login in equals & hashcode, oder auf den Namen?
 
Wenn du auf alles ausser ID prüfst, hast du Wertobjekte, sollten immutable sein.

Identitätsbjekte (= selbe Werte, trotzdem unterschiedliche Objekte) sind da anders, Wolfgang Meier zB. gibt es eben mehrere,
 
Das ist eine Architekturfrage, Wertobjekte vs. Identitätsobjekte (Value objects vs identity objects), kannst ja mal googeln 😉

Da ich deine Architektur nicht kenne, kann ich die Frage nicht beantwroten, dachte aber das es gut wäre, wenn du zumindes wüsstest das es beide gibt.
 
Ist auch nicht ganz einfach, braucht Zeit um sich zu setzen, einfach mal vor dem einschlafen lesen 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben