2015-02-11 87 views
6

根據文檔爲什麼在junit中assertEquals和assertSame對於兩個相同類的實例返回相同的結果?

assertEquals()聲明兩個對象相等。

assertSame()聲明兩個對象引用同一個對象。

所以我期待,如果我有一個像下面

class SomeClass {} 

一類則

SomeClass someClass1= new SomeClass(); 
SomeClass someClass2= new SomeClass(); 
assertSame(someClass1,someClass2); // fail 
assertEquals(someClass1,someClass2); // fail 

在斷言傳遞和assertSame失敗。因爲兩個類的值都是相等的,但它們具有不同的參考位置。

因爲我在兩種情況下都失敗了,那麼我的問題是這兩者之間有什麼區別?

回答

10

由於您未覆蓋班級中的等於,所以assertEquals的行爲與assertSame的行爲相同,因爲默認值等於實施比較參考。

150 public boolean equals(Object obj) { 
151  return (this == obj); 
152 } 

如果你提供一個平等的啞壓倒一切:

class SomeClass { 
    @Override 
    public boolean equals(Object o) { 
     return true; 
    } 
} 

你會看到assertEquals成功。

7

assertEquals使用equals()方法(即您應該在類中重寫以真正比較其實例)來比較對象,而assertSame使用==運算符來比較它們。所以差異與==(按價值比較)和equals(比較同一性)完全相同。

0

第一個斷言失敗,因爲someClass1sameClass2不是相同的實例。第二個斷言失敗,因爲equals(Object)方法尚未在SomeClass中定義,其超級equals(Object)確實引用相等。由於兩個不同的實例比較相等,所以這個失敗的原因與第一個相同。

2

官方JUnit的文檔:

的assertEquals:斷言兩個對象是相等

assertSame:聲明兩個對象是指相同的對象

換句話說

的assertEquals:使用equals()方法,或者如果沒有equals()方法被重寫時,該兩個對象之間的參考相比較。

assertSame:比較兩個對象之間的引用。

實施例1:equals方法是覆蓋,所以assertSame和的assertEquals返回相同的結果,因爲它們比較對象的參考。

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]> 
    } 
} 

實施例2:等於法重寫,所以assertSame和的assertEquals返回不相同的結果,因爲equals方法將由本的assertEquals時間使用。

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 
    } 
} 
相關問題