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



## kiki07 (9. Okt 2014)

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.


----------



## Flown (9. Okt 2014)

Wahrscheinlich hast du die Methode in deiner Kunden-Klasse nicht überschrieben.


----------



## kiki07 (9. Okt 2014)

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.


----------



## arilou (10. Okt 2014)

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).



kiki07 hat gesagt.:


> 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.


----------



## Momolin (10. Okt 2014)

Hi,
wie die Vorredner schon schrieben: Du musst die equals-Methode überschreiben. Eclipse macht das automatisch so:

```
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):

```
@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


----------



## kiki07 (10. Okt 2014)

Danke, es funktioniert jetzt. Ging ja ganz einfach, weil eclipse alles selbt implementiert. Wobei ich nicht so ganz verstehe was hashCode bedeuten soll....


----------

