2017-02-01 132 views
4

Eclipse給我一個警告,說Assert類型的方法assertEquals(Object[], Object[])已被棄用。我使用JUnit 4爲什麼不推薦使用來自JUnit 4的assertEquals(Object [],Object [])?

我寫在Eclipse下面的代碼:

import org.junit.Test; 
import org.junit.Assert; 

public class Generics { 
    public <T> T[] genericArraySwap(T[] list, int pos1, int pos2) throws IndexOutOfBoundsException { 
     ... 
    } 

    @Test 
    public void genericArraySwapTest() { 
     Integer[] IntegerList = {0, 1, 2, 3, 4};   
     Assert.assertEquals(new Integer[] {0, 1, 2, 4, 3}, genericArraySwap(IntegerList, 3, 4)); 
    } 
} 

誰能告訴我,爲什麼這種方法已經過時或什麼方法我應該使用?

+2

您應該使用assertArrayEquals(Object [] expecteds,Object [] actuals)'而不是'assertEquals(Object [],Object [])''。 – alfasin

+5

「不贊成使用assertArrayEquals」我猜測它已被棄用,因爲它太容易錯誤地調用assertEquals(Object,Object [])'。 –

+0

謝謝,沒有看到那一個。 – karposhark

回答

4

由於缺乏Java類型系統的表達能力而不推薦使用。

而所有其他assertEquals方法會比較使用==(原語)或equals(引用類型)的參數,你不想爲使用比較數組:所有的數組都是Object亞型(即它們是參考類型),並且不要覆蓋equals,所以使用assertEquals比較數組將檢查兩個數組是否相同。

相反,您應該調用assertArrayEquals,它比較數組是否具有相同的長度,如果是,則檢查相應的數組元素是否相等。

理想情況下,你就可以指定這樣的參數類型:

assertEquals(T, T) 

其中T是「的Object任何亞型,除了陣列」。但是你根本無法用Java來做到這一點;即使有辦法表達這樣的約束,也不能阻止使用數組調用該方法,因爲您始終可以將它們上傳到Object s。

,你唯一可以做的事情是:

  • 提供接受Object小號
  • 提供接受更多的特定類型的重載過載,並標記這些重載@Deprecated。要覆蓋所有數組類型,需要9個重載(每個基本類型8個;覆蓋所有其他引用類型的1個Object[])。

這並不妨礙您調用assertEquals(T[], T[]),但它通過編譯器警告突出顯示存在問題; Eclipse中的黃色波浪曲線;等等。

當然,這不會幫助你將數組上傳到Object;但在大多數情況下,除非您真的打算調用該特定方法,否則您不會這樣做。

相關問題