2010-05-27 2 views
26

Ho un metodo che sto provando per unit test. Questo metodo accetta un parametro come ArrayList e fa le cose con esso. La finta che sto cercando di definire è:.mockito ArrayList <String> problem

ArrayList<String> mocked = mock(ArrayList.class); 

che dà un [incontrollato] incontrollato avvertimento conversione"

ArrayList<String> mocked = mock(ArrayList<String>.class); 

mi dà un errore

Chiunque cura di illuminami da. cosa sto facendo male?

risposta

52

L'alternativa è quella di utilizzare l'annotazione @Mock da allora Mockito può utilizzare tipo a riflessione per individuare il tipo generico:

public class MyTest { 

    @Mock 
    private ArrayList<String> mockArrayList; 

    ... 

    public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    } 

    public void testMyTest() { 
    when(mockArrayList.get(0)).thenReturn("Hello world"); 

    String result = mockArrayList.get(0); 

    assertEquals("Should have the correct string", "Hello world", result); 

    verify(mockArrayList).get(0); 
    } 
} 
+1

Grazie. Soluzione intelligente È piuttosto ingiusto, che non è contrassegnato come quello. – pimpf0r

+0

Ottima risposta, ho finito per usare questo approccio. –

+0

Sì, non ho guardato quella domanda da secoli ... Mi dispiace. – Sardathrion

23

ArrayList<String>.class è un costrutto non supportato dal compilatore Java

Per provare prima, si dovrebbe fare questo:

@SuppressWarnings("unchecked") 
ArrayList<String> mocked = mock(ArrayList.class); 

Questo accade perché mock metodo può restituire solo un tipo grezzo. In generale, non è opportuno utilizzare i tipi non elaborati poiché ciò potrebbe causare errori di runtime. Nel tuo caso è perfettamente a posto, perché sai che mocked non è un REALE ArrayList<String>.

Solo un avviso generale sull'annotazione @SuppressWarnings("unchecked"). Cerca di tenerlo il più vicino possibile alla fonte del problema. Ad esempio puoi metterlo solo per la dichiarazione della variabile, oppure puoi sopprimerlo per l'intero metodo. In generale sopprimetelo per una variabile, perché altrimenti l'annotazione del metodo ampio può sopprimere altri problemi nella vostra funzione.

+3

Come nota, questo particolare problema è discusso come punto 24 (alle pagine 116- 118) di Effective Java, Seconda edizione. L'intero capitolo di Generics è disponibile in formato PDF sul sito Sun: http://java.sun.com/docs/books/effective/generics.pdf – Powerlord

+0

Questo ha senso. In generale non mi piace ignorare gli avvertimenti, ma non sapevo che si potesse ignorare una sola riga. Grazie. – Sardathrion