2010-05-27 24 views
26

Tengo un método que estoy tratando de probar en una unidad. Este método toma un parámetro como ArrayList y hace cosas con él. La maqueta que estoy tratando de definir es:.mockito ArrayList <String> problema

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

que da una marcada advertencia [marcar] conversión"

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

me da un error

A alguien le importa que me ilumine en cuanto a. lo que estoy haciendo mal?

Respuesta

52

La alternativa es utilizar la anotación @Mock desde entonces Mockito puede utilizar tipo de reflexión para encontrar el tipo genérico:

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

Gracias. Solución inteligente. Es un poco injusto, que no está marcado como eso. – pimpf0r

+0

Gran respuesta, terminé usando este enfoque. –

+0

Sí, no miró esa pregunta en años ... Lo siento. – Sardathrion

23

ArrayList<String>.class es una construcción no compatible con el compilador de Java.

Por primera vez que intente, usted debe hacer esto:

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

Esto sucede porque mock método sólo puede devolver un tipo de prima. En general, no es bueno usar los tipos crudos porque esto puede generar errores de tiempo de ejecución. En su caso, está perfectamente bien, porque usted sabe que mocked no es un REAL ArrayList<String> de todos modos.

Sólo un consejo general sobre la anotación @SuppressWarnings("unchecked"). Intente mantenerlo lo más cerca posible del origen del problema. Por ejemplo, puede ponerlo solo para la declaración de variable, o puede suprimirlo para todo el método. En general, suprímalo para una variable, porque de lo contrario la anotación de método amplio puede suprimir otros problemas en su función.

+3

Como nota al margen, este problema particular, se discute como artículo 24 (en las páginas 116- 118) de Effective Java, Second Edition. El capítulo entero de Generics está disponible en formato PDF en el sitio de Sun: http://java.sun.com/docs/books/effective/generics.pdf – Powerlord

+0

Eso tiene sentido. En general, me desagrada ignorar las advertencias, pero no sabía que podrías ignorar solo una línea. Gracias. – Sardathrion

Cuestiones relacionadas