2017-02-01 12 views
4

Eclipse дает мне предупреждение, в котором говорится, что метод assertEquals(Object[], Object[]) от типа Assert устарел. Я использую JUnit 4.Почему assertEquals (Object [], Object []) из JUnit 4 устарел?

Я написал следующий код в 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

«Устаревший. Use assertArrayEquals» Я бы предположил, что он устарел, потому что слишком просто вызвать 'assertEquals (Object, Object [])' по ошибке. –

+0

Спасибо, не видел этого. – karposhark

ответ

4

Это устарело из-за отсутствия выразительности системы типа Java.

В то время как все другие assertEquals методы будут сравнивать параметры с помощью == (для примитивов) или equals (для ссылочных типов), вы не хотите использовать либо для сравнения массивов: все массивы являются подтипами Object (т.е. являются ссылочными типами) и не переопределяют equals, поэтому с помощью assertEquals для сравнения массивов будет проверяться идентичность двух массивов.

Вместо этого вы должны вызывать assertArrayEquals, который сравнивает, имеют ли массивы одинаковые длины, и если да, то соответствуют ли соответствующие элементы массива.

В идеале, вы должны быть в состоянии определить типы параметров, как это:

assertEquals(T, T) 

где T является «любой подтип Object, для массивов, за исключением». Но вы просто не можете сделать это на Java; даже если бы существовал способ выражения такого ограничения, вы не могли помешать вызову метода с массивом, потому что вы всегда можете повысить их до Object.

Единственное, что вы можете сделать, это:

  • Обеспечить перегрузку, которая принимает Object сек
  • Предоставить перегрузки, которые принимают более конкретные тип, и отметьте эти перегруженные @Deprecated. Чтобы охватить все типы массивов, вам необходимо 9 перегрузок (по 8 для каждого из типов примитивных массивов: 1 для Object[], который охватывает все остальные ссылочные типы).

Это не мешает вам вызывать assertEquals(T[], T[]), но он подчеркивает, что там есть проблема с помощью предупреждений компилятора; желтые squiggles в Eclipse; и т. д.

Конечно, это не поможет в случае, если вы собрали массивы до Object; но вы не будете, в большинстве случаев, если вы действительно не собираетесь использовать этот конкретный метод.

Смежные вопросы