it-swarm.com.de

Warum geben assertEquals und assertSame in junit dasselbe Ergebnis für zwei Instanzen derselben Klasse zurück?

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? 

12
rawData

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.

20
Alexis C.

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

8
mkrakhin

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
    }
}
2
KeyMaker00

assertEquals: ==
assertSame: ===

'same' entspricht dem Typ zusammen mit dem Wert, der mit '===' identisch ist.

0
tfont

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
}
0
Saurabh Oza

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.

0
Boris Pavlović