Considera este código:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
public class DummyClassTest {
public void testMockitoWithGenerics() {
DummyClass dummyClass = Mockito.mock(DummyClass.class);
List<? extends Number> someList = new ArrayList<Integer>();
Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
}
}
El compilador se queja de la línea que está tratando de impedir el comportamiento dummyMethod()
. ¿Alguna sugerencia sobre cómo se aplican los métodos de troquelado que devuelven un tipo con comodines delimitados?
java
unit-testing
generics
mockito
bounded-wildcard
Shikhar Mishra
fuente
fuente
Respuestas:
También puede utilizar el método seguro no tipo doReturn para este propósito,
como se discutió en el grupo de Google de Mockito.
Si bien esto es más simple que
thenAnswer
, tenga en cuenta que no es de tipo seguro. Si le preocupa la seguridad de los tipos, la respuesta de millhouse es correcta.Detalles adicionales
Para ser claros, aquí está el error observado del compilador,
Creo que el compilador ha asignado el primer tipo de comodín durante la
when
llamada y luego no puede confirmar que el segundo tipo de comodín en lathenReturn
llamada sea el mismo.Parece que
thenAnswer
no se encuentra con este problema porque acepta un tipo de comodín mientrasthenReturn
toma un tipo de comodín, que debe ser capturado. De Mockito's OngoingStubbing ,fuente
Supongo que desea poder cargar
someList
algunos valores conocidos; Aquí hay un enfoque que se utilizaAnswer<T>
junto con un método auxiliar con plantilla para mantener todo seguro de tipo:fuente
Golpeé lo mismo ayer. Ambas respuestas de @ nondescript1 y @millhouse me ayudaron a encontrar una solución alternativa. He usado el mismo código que @millhouse, excepto que lo hice un poco más genérico, porque mi error no fue causado por un
java.util.List
, sino por elcom.google.common.base.Optional
. Mi pequeño método de ayuda, por lo tanto, permite cualquier tipoT
y no soloList<T>
:Con este método de ayuda podrías escribir:
Esto compila muy bien y hace lo mismo que el
thenReturn(...)
método.¿Alguien sabe si el error que emite el compilador de Java es un error del compilador o si el código es realmente incorrecto?
fuente
Mockito.when(dummyClass.dummyMethod()).thenAnswer(x -> someList)
por lo que no es necesario el método de utilidadEstoy convirtiendo el comentario de fikovnik en una respuesta aquí para darle más visibilidad, ya que creo que es la solución más elegante con Java 8+.
La documentación de Mockito recomienda usar
doReturn()
(como se sugiere en la respuesta aceptada) solo como último recurso.En cambio, para evitar el error del compilador descrito en la pregunta,
when()
se puede usar el enfoque Mockito recomendado conthenAnswer()
una lambda (en lugar de un método auxiliar):fuente
Aunque el método de utilidad propuesto por Marek Radonsky funciona, también existe otra opción que ni siquiera requiere la expresión lambda (en mi humilde opinión) sugerida por fikovnik:
Como muestra esta respuesta a una pregunta similar, también puede usar lo siguiente:
fuente