JUnit: Objekte von eigenen Klassen vergleichen...geht nicht

kiki07

Mitglied
Hallo,

ich möchte mit der assertEquals(Object)-Methode in JUnit Objekte von selbst geschriebenen Klassen auf Gleichheit der Attributwerte überprüfen. Equals überprüft ja nicht auf gleiche Referenzen, aber trotzdem kommt immer die Fehlermeldung, dass eine andere Adresse erwartet wurde....Das verstehe ich nicht.

Dabei ist es egal ob es sich um den Vergleich einzelner Objekte oder ganzer Arrays handelt.... Nur wenn beide Objekte null sind, verläuft der Test positiv.

Bsp:
Kunde k1 = new Kunde("A", 1);
Kunde k2 = new Kunde("A", 1);
assertEquals(k1, k2); --> negativ

Hat jemand eine Erklärung parat wieso es trotz identischer Werte nich funktioniert?

Nachtrag: Der Vergleich einzelner Attributwerte funktioniert also z.B. assertEquals(k1.name, k2.name), aber nicht das ganze Objekt.
 
Zuletzt bearbeitet:
Okay danke für den Tipp, aber damit kann ich jetzt nicht ganz so viel anfangen.... Was muss denn da konkret in die Klasse rein? Überschreiben kenn ich nur als Veränderung/Ausfüllen von Methoden der Oberklasse, aber im Zusammenhang mit JUnit wüsste ich nicht, wie ich das machen soll.
 
Flown wird gemeint haben, dass du die Methode .equals(...) in der Klasse Kunde nicht implementiert hast (und damit die Standard-Implementierung von java.lang.Object nicht überschrieben hast).

Equals überprüft ja nicht auf gleiche Referenzen
...sofern du es (selbst) anders programmiert/überschrieben hast, also in deiner Kunden-Klasse eine entsprechende .equals-Methode programmiert ist.
 
Zuletzt bearbeitet:
Hi,
wie die Vorredner schon schrieben: Du musst die equals-Methode überschreiben. Eclipse macht das automatisch so:
Java:
public class Kunde {

	private String name;
	private int nummer;

	public Kunde(String name, int nummer) {
		this.name = name;
		this.nummer = nummer;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;

		if (obj == null) return false;

		if (getClass() != obj.getClass()) return false;

		Kunde other = (Kunde) obj;
		if (name == null) {
			if (other.name != null) return false;
		}

		else if (!name.equals(other.name)) return false;

		if (nummer != other.nummer) return false;

		return true;
	}
}

und dann muss gelten (also die Tests dürfen nicht fehlschlagen):
Java:
@Test
public void testEqualsObject() {
	Kunde a, b, c;

	a = new Kunde("a", 1);
	b = new Kunde("a", 1);
	c = new Kunde("a", 1);

	assertEquals(a, a);
	assertEquals(a, b);
	assertEquals(b, a);
	assertEquals(a, c);
	assertEquals(b, c);
}

vgl: Object (Java Platform SE 8 )

Grüße
 
Zuletzt bearbeitet:
Danke, es funktioniert jetzt. Ging ja ganz einfach, weil eclipse alles selbt implementiert. Wobei ich nicht so ganz verstehe was hashCode bedeuten soll....
 

Neue Themen


Zurück
Oben