2014-07-11 50 views
1

我正在使用具有大量單元測試的Java Web應用程序。我們在Eclipse中運行單元測試。我正在通過測試並重構其中的一些。我已經看到了寫有這樣幾個測試(我會熬下來的說法,我的文字的例子實際上是在測試變量)意外的JUnit行爲

assertEquals(new Integer(7), new Long(7)); 

該測試通過!和我不明白爲什麼,因爲類型是不同的。看到這種現象後,我創建Eclipse的一個簡單的Java項目,基本上寫了相同的單元測試

assertEquals(new Integer(7), new Long(7); 

,並未能如我所料。我不需要任何幫助,我只是好奇,測試如何在一個環境中傳遞,並且在另一個環境中失敗(應該如此)。

+1

如果您包含實際的代碼,它會更容易幫助您。 –

+2

你確定它們都是java.lang.Integer嗎?如果不是這樣,也許一個自定義的類可以重寫equals方法......毫無疑問,這是一個長鏡頭,但這是一個可能的解釋。 –

+0

除非您可以提供'Integer'和'Long'的完全限定名,否則我們會在這裏抓住吸管。我同意@EdwinBuck的看法,認爲這可能是壓倒其中一個類的東西,但我不確定是什麼,也不知道爲什麼。 – Makoto

回答

1

如果你看一下java.lang.Long中的equals方法,它說:

public boolean equals(Object obj) { 
    if (obj instanceof Long) { 
     return value == ((Long)obj).longValue(); 
    } 
    return false; 
} 

所以new Long(7).equals(new Integer(7))應該是假的,因爲整數的instanceof龍是假的。這個測試程序確認:

public class Stuff { 

    public static void main(String[] args) { 
     System.out.println("int equals long : " + new Integer(7).equals(new Long(7))); 
     System.out.println("long equals int : " + new Long(7).equals(new Integer(7))); 
    } 
} 

打印出

int equals long : false 
long equals int : false 

我猜測,想出了相反的結果web應用測試中使用的附加像ComparableAssert,它有這個簽名

public static void assertEquals(java.lang.Comparable expected, 
           java.lang.Comparable actual) 

這很容易讓另一個錯誤,特別是如果測試使用靜態導入。長整數和整數可以相互比較(new Long(7).compareTo(new Integer(7))評估爲0),所以這個斷言會成功。