Laut Dokumentation
assertEquals () Gibt an, dass zwei Objekte gleich sind.
assertSame () Gibt an, dass zwei Objekte auf dasselbe Objekt verweisen.
Ich erwarte das also, wenn ich eine Klasse wie unten habe
class SomeClass {}
dann
SomeClass someClass1= new SomeClass();
SomeClass someClass2= new SomeClass();
assertSame(someClass1,someClass2); // fail
assertEquals(someClass1,someClass2); // fail
assertEquals sollte bestanden haben und assertSame sollte fehlschlagen, da der Wert beider Klassen gleich ist, aber unterschiedliche Referenzpositionen haben.
Wenn ich in beiden Fällen versage, dann frage ich mich, was ist der Unterschied zwischen diesen beiden?
Da Sie in Ihrer Klasse keine Gleichheitszeichen überschrieben haben, verhält sich assertEquals
genauso wie assertSame
, da die Standardvergleichsreferenzen der Implementierung gleich sind.
150 public boolean equals(Object obj) {
151 return (this == obj);
152 }
Wenn Sie ein dummes Überschreiben von Gleichgestellten angeben:
class SomeClass {
@Override
public boolean equals(Object o) {
return true;
}
}
sie werden sehen, dass assertEquals
erfolgreich ist.
assertEquals
verwendet die equals()
-Methode (die Sie in Ihrer Klasse überschreiben müssen, um die Instanzen wirklich zu vergleichen), um Objekte zu vergleichen, während assertSame
den Operator ==
verwendet, um sie zu vergleichen. Der Unterschied ist also genau der gleiche wie zwischen ==
(vergleiche durch Wert) und equals
(vergleiche Identität).
Offizielle JUnit-Dokumentation:
assertEquals: Gibt an, dass zwei Objekte gleich sind.
assertSame: Gibt an, dass zwei Objekte auf das dasselbe Objekt verweisen.
Mit anderen Worten
assertEquals: Verwendet die equals () -Methode. Wenn keine equals () -Methode überschrieben wurde, wird die Referenz zwischen den beiden Objekten verglichen.
assertSame: vergleicht die Referenz zwischen den 2 Objekten.
Beispiel 1: Die Methode equals wurde not überschrieben. Daher geben assertSame und assertEquals dasselbe Ergebnis zurück, da sie die Referenz der Objekte vergleichen.
public class A {
private int i;
public A(int i){ this.i = i; }
}
public class TestA {
final A a1 = new A(0);
final A a2 = new A(0);
@Test
public void assertsame_testAssertSame(){
assertSame(a1, a2); // AssertionError: expected:<[email protected]> but was:<[email protected]>
}
@Test
public void assertsame_testAssertEquals(){
assertEquals(a1, a2); // AssertionError: expected:<[email protected]> but was:<[email protected]>
}
}
Example 2: Die equals-Methode wurde überschrieben. Daher geben assertSame und assertEquals nicht dasselbe Ergebnis zurück, da die equals-Methode diesmal von assertEquals verwendet wird.
public class A {
private int i;
public A(int i){ this.i = i; }
@Override
public boolean equals(Object o){
// self check
if(this == o){ return true; } else
// null check
if(o == null){ return false;} else
// type check and cast
if(getClass() != o.getClass()){ return false; } else {
final A a = (A) o;
// field comparison
return Objects.equals(a, a);
}
}
}
public class TestA {
final A a1 = new A(0);
final A a2 = new A(0);
@Test
public void assertsame_testAssertSame(){
assertSame(a1, a2); // AssertionError: expected:<[email protected]> but was:<[email protected]>
}
@Test
public void assertsame_testAssertEquals(){
assertEquals(a1, a2); // OK
}
}
assertEquals: ==
assertSame: ===
'same' entspricht dem Typ zusammen mit dem Wert, der mit '===' identisch ist.
assertEquals - Überprüft, ob die Objekte gleich sind oder nicht, basierend auf der überschriebenen equals () -Methode dieser Klasse. So können wir die Gleichheit von Objekten anhand ihres Zustands überprüfen (vergleichen Sie die Werte ihrer Instanzvariablen).
assertEquals () Die assertEquals () -Methode vergleicht zwei Objekte unter Verwendung ihrer equals () -Methode auf Gleichheit.
@Test
public void assertEquals_example() {
Employee employeeNew = new Employee();
employee.setSalary(1000000.0);
assertEquals("EMPLOYEE OBJECT", employee, employeeNew);
}
Wenn die beiden Objekte gemäß der Implementierung ihrer equals () -Methode gleich sind, wird die assertEquals () -Methode normal zurückgegeben. Andernfalls löst die assertEquals () -Methode eine Ausnahme aus, und der Test wird dort angehalten.
assertSame () und assertNotSame () Die Methoden assertSame () und assertNotSame () prüfen, ob zwei Objektverweise auf dasselbe Objekt verweisen oder nicht. Es reicht nicht aus, dass die beiden Objekte, auf die verwiesen wird, gemäß ihrer equals () -Methode gleich sind. Es muss genau dasselbe Objekt sein, auf das gezeigt wird.
Hier ist ein einfaches Beispiel:
@Test
public void assertSame_assertNoSame_example() {
assertSame(employeeService.getEmployeeFromId(1), employeeService.getEmployeeFromId(1));
assertNotSame(employee, employeeService.getEmployeeFromId(1)); // We will get null as response
}
Die erste Zusicherung schlägt fehl, da someClass1
und sameClass2
nicht die gleichen Instanzen sind. Die zweite Assertierung schlägt fehl, da die equals(Object)
-Methode nicht in SomeClass
definiert wurde und deren übergeordnete equals(Object)
Gleichheit referenziert. Da zwei verschiedene Instanzen auf Gleichheit verglichen werden, versagt diese aus demselben Grund wie die erste.