¿Existe un método limpio de burlarse de una clase con parámetros genéricos? Digamos que tengo que burlarme de una clase Foo<T>
que necesito pasar a un método que espera a Foo<Bar>
. Puedo hacer lo siguiente con bastante facilidad:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
Suponiendo que getValue()
devuelve el tipo genérico T
. Pero eso tendrá gatitos cuando más tarde lo pase a un método esperando Foo<Bar>
. ¿Es el casting el único medio para hacer esto?
Otra forma de evitar esto es usar
@Mock
anotaciones en su lugar. No funciona en todos los casos, pero se ve mucho más sexy :)Aquí hay un ejemplo:
El
MockitoJUnitRunner
inicializa los campos con anotada@Mock
.fuente
SuppressWarnings
. Las advertencias existen por una razón, es mejor no tener el hábito de suprimirlas. ¡Gracias!@Mock
lugar demock()
: los campos siguen siendo nulos durante el tiempo de construcción, por lo que no puedo insertar dependencias en ese momento y no puedo hacer que los campos sean definitivos. El primero se puede resolver mediante un@Before
método anotado, por supuesto.Siempre puede crear una clase / interfaz intermedia que satisfaga el tipo genérico que desea especificar. Por ejemplo, si Foo fuera una interfaz, podría crear la siguiente interfaz en su clase de prueba.
En situaciones en las que Foo es una clase no final , puede extender la clase con el siguiente código y hacer lo mismo:
Entonces podría consumir cualquiera de los ejemplos anteriores con el siguiente código:
fuente
Foo
sea una interfaz o clase no final, esta parece ser una solución razonablemente elegante. Gracias.Crea un método de utilidad de prueba . Especialmente útil si lo necesita por más de una vez.
fuente
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
ni siquiera necesita una sola supresión :) Pero ten cuidado,Integer num = genericMock(Number.class)
compila, pero tiraClassCastException
. Esto solo es útil para elG<P> mock = mock(G.class)
caso más común .Estoy de acuerdo en que no se deben suprimir las advertencias en clases o métodos, ya que se podrían pasar por alto otras advertencias suprimidas accidentalmente. Pero en mi humilde opinión, es absolutamente razonable suprimir una advertencia que afecta solo a una sola línea de código.
fuente
Aquí hay un caso interesante: el método recibe una colección genérica y devuelve una colección genérica del mismo tipo base. Por ejemplo:
Este método se puede burlar con la combinación de Mockito anyCollectionOf matcher y la respuesta.
fuente