¿Hay alguna manera de capturar una lista de tipos específicos usando mockitos ArgumentCaptore? Esto no funciona:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
java
unit-testing
junit
mockito
Andreas Köberle
fuente
fuente
ArrayList
). Siempre puedes usar laList
interfaz, y si quieres representar el hecho de que es covariante, entonces puedes usarextends
:ArgumentCaptor<? extends List<SomeType>>
Respuestas:
El problema genérico anidado se puede evitar con la anotación @Captor :
fuente
MockitoAnnotations.initMocks(this)
el@Before
método en lugar de usar un corredor que excluye la posibilidad de usar otro corredor. Sin embargo, +1, gracias por señalar la anotación.Sí, este es un problema genérico general, no específico de simulacro.
No hay ningún objeto de clase
ArrayList<SomeType>
y, por lo tanto, no puede escribir con seguridad dicho objeto a un método que requiera unClass<ArrayList<SomeType>>
.Puede lanzar el objeto al tipo correcto:
Esto le dará algunas advertencias sobre los lanzamientos inseguros y, por supuesto, su ArgumentCaptor no puede realmente diferenciar entre
ArrayList<SomeType>
yArrayList<AnotherType>
sin quizás inspeccionar los elementos.(Como se mencionó en la otra respuesta, si bien este es un problema genérico general, existe una solución específica de Mockito para el problema de seguridad de tipo con la
@Captor
anotación. Todavía no se puede distinguir entre anArrayList<SomeType>
y anArrayList<OtherType>
.)Editar:
Mire también el comentario de tenshi . Puede cambiar el código original de Paŭlo Ebermann a esto (mucho más simple)
fuente
ArgumentCaptor<List<SimeType>> argument = ArgumentCaptor.forClass((Class) List.class);
@SuppressWarnings("unchecked")
anotación sobre la línea de definición del captor de argumentos. Además, enviar aClass
es redundante.Class
no es redundante en mis pruebas.Si no le temes a la antigua semántica de estilo java (genérico sin tipo seguro), esto también funciona y es razonablemente simple:
fuente
fuente
Basado en los comentarios de @ tenshi y @ pkalinow (también felicitaciones a @rogerdpack), la siguiente es una solución simple para crear un captor de argumentos de lista que también deshabilita la advertencia "utiliza operaciones no verificadas o inseguras" :
Ejemplo completo aquí y la compilación y prueba de CI correspondientes que se ejecutan aquí .
Nuestro equipo ha estado usando esto durante algún tiempo en nuestras pruebas unitarias y esta parece ser la solución más sencilla para nosotros.
fuente
Para una versión anterior de junit, puedes hacer
fuente
Tuve el mismo problema con la actividad de prueba en mi aplicación de Android. Solía
ActivityInstrumentationTestCase2
yMockitoAnnotations.initMocks(this);
no funcionaba. Resolví este problema con otra clase con campo respectivamente. Por ejemplo:Luego, en el método de prueba de actividad:
fuente
Hay un problema abierto en GitHub de Mockito sobre este problema exacto.
He encontrado una solución simple que no te obliga a usar anotaciones en tus pruebas:
Lo que sucede aquí es que creamos una nueva clase con la
@Captor
anotación e inyectamos el captor en ella. Luego simplemente extraemos el captor y lo devolvemos de nuestro método estático.En su prueba, puede usarlo así:
O con una sintaxis que se parece a la de Jackson
TypeReference
:Funciona porque Mockito no necesita ningún tipo de información (a diferencia de los serializadores, por ejemplo).
fuente