Detalle del error:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Boolean cannot be returned by updateItemAttributesByJuId()
updateItemAttributesByJuId() should return ResultRich
This exception might occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.
mi código :
@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;
when(arrangeManagerSpy
.updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
.thenReturn(false);
Como puede ver, estoy llamando when
a updateItemAttributes
(que devuelve a boolean
) no a updateItemAttributesByJuId
.
- ¿Por qué Mockito intenta devolver un
boolean
deupdateItemAttributesByJuId
? - ¿Cómo se puede rectificar esto?
@Repository
método Spring DAO con @Aspect . si lo hagowhen(someDao.someMethod()).thenReturn(List<xxx>)
, tengo esta excepción WrongTypeOfReturnValue. A través de la depuración, puedo ver que ensomeMethod
realidad se ha llamado al método en la declaración anterior y activa el consejo de vuelta y devuelve unnull
pero Mockito espera unList<xxx>
.Otra razón para un mensaje de error similar es intentar simular un
final
método. Uno no debería intentar burlarse de los métodos finales (ver Burla del método final ).También me he enfrentado al error en una prueba de subprocesos múltiples. La respuesta de gna funcionó en ese caso.
fuente
Problema muy interesado. En mi caso, este problema fue causado cuando intenté depurar mis pruebas en esta línea similar:
La nota importante es que las pruebas se ejecutaron correctamente sin depurar.
De cualquier manera, cuando reemplacé el código anterior con el siguiente fragmento de código, pude depurar la línea del problema sin problemas.
fuente
Para mí, esto significaba que estaba ejecutando esto:
a = Mockito.mock(SomeClass.class); b = new RealClass(); when(b.method1(a)).thenReturn(c); // within this method1, it calls param1.method2() -- note, b is not a spy or mock
Entonces lo que estaba sucediendo es que Mockito estaba detectando que
a.method2()
estaba siendo llamado y me decía que no podía regresarc
de loa.method2()
que estaba mal.Solución: use la
doReturn(c).when(b).method1(a)
sintaxis de estilo (en lugar dewhen(b.method1(a)).thenReturn(c);
), que lo ayudará a descubrir el error oculto de manera más concisa y rápida.O en este caso particular, después de hacer eso, comenzó a mostrar la "NotAMockException" más precisa, y la cambié para que ya no intente establecer un valor de retorno de un objeto no simulado.
fuente
Recientemente tuve este problema. El problema era que el método que intentaba simular no tenía modificador de acceso. Agregar público resolvió el problema.
fuente
Tuve este error porque en mi prueba tenía dos expectativas, una en un simulacro y otra en tipo concreto
MyClass cls = new MyClass(); MyClass cls2 = Mockito.mock(Myclass.class); when(foo.bar(cls)).thenReturn(); // cls is not actually a mock when(foo.baz(cls2)).thenReturn();
Lo arreglé cambiando cls para que sea una simulación también
fuente
En mi caso, el problema fue causado por intentar simular un método estático y olvidarme de llamar
mockStatic
a la clase. También olvidé incluir la clase en el@PrepareForTest()
fuente
Si está usando anotaciones, es posible que necesite usar @Mock en lugar de @InjectMocks. Porque @InjectMocks funciona como @Spy y @Mock juntos. Y @Spy realiza un seguimiento de los métodos ejecutados recientemente y es posible que sienta que se devuelven / sustituyen datos incorrectos.
fuente
@InjectMocks
funciona como@Spy
y@Mock
juntos". <- eso me parece mal. ¿De dónde escuchaste esto?En mi caso, estaba usando ambos
@RunWith(MockitoJUnitRunner.class)
yMockitoAnnotations.initMocks(this)
. Cuando lo quitéMockitoAnnotations.initMocks(this)
funcionó correctamente.fuente
Error:
Código real:
@RunWith(PowerMockRunner.class) @PrepareForTest({ Object.class, ByteString.class}) @Mock private ByteString mockByteString; String testData = “dsfgdshf”; PowerMockito.when(mockByteString.toStringUtf8()).thenReturn(testData); // throws above given exception
Solución para solucionar este problema:
1º Eliminar la anotación “@Mock”.
private ByteString mockByteString;
2do Agregar
PowerMockito.mock
fuente
Recientemente encontré este problema mientras me burlaba de una función en una clase de datos de Kotlin . Por alguna razón desconocida, una de mis ejecuciones de prueba terminó en un estado congelado. Cuando volví a ejecutar las pruebas, algunas de mis pruebas que habían pasado anteriormente comenzaron a fallar con la
WrongTypeOfReturnValue
excepción.Me aseguré de que estaba usando
org.mockito:mockito-inline
para evitar los problemas con las clases finales (mencionado por Arvidaa), pero el problema persistió. Lo que me resolvió fue matar el proceso y reiniciar Android Studio . Esto terminó mi ejecución de prueba congelada y las siguientes ejecuciones de prueba pasaron sin problemas.fuente
Falta @MockBean en el bean que quieres burlarte
fuente
Tengo este problema
WrongTypeOfReturnValue
porque me burlé de un método que devuelve unjava.util.Optional;
con uncom.google.common.base.Optional;
debido a que mi formateador agrega automáticamente las importaciones faltantes.Mockito me estaba diciendo que "el método algo () debería devolver Opcional" ...
fuente
En mi caso, el bean se ha inicializado usando la anotación @Autowired en lugar de @MockBean
Entonces, de esta manera, burlarse de DAO y Servicios arroja tal excepción
fuente
Para mí, el problema eran las pruebas multiproceso que estaban haciendo stubbing / verificación en simulaciones compartidas. Condujo a lanzar
WrongTypeOfReturnValue
excepciones al azar .Esta no es una prueba escrita correctamente usando Mockito. No se debe acceder a los simulacros desde varios hilos.
La solución fue hacer simulaciones locales para cada prueba.
fuente
TL; DR Si algunos argumentos en su prueba lo son
null
, asegúrese de simular la llamada al parámetro con enisNull()
lugar deanyXXX()
.Recibí este error al actualizar de Spring boot 1.5.xa 2.1.x. Spring boot viene con su propio Mockito, que ahora también está actualizado a 2.x (ver, por ejemplo, Dependencias de Spring boot 2.1.2 )
Mockito ha cambiado el comportamiento del
anyXXX()
método, dondeXXX
esString
,Long
, etc Aquí está el Javadoc deanyLong()
:Le sugiero que depure hasta el punto en que su simulacro esté a punto de ser llamado e inspeccione si al menos un argumento lo es
null
. En ese caso, asegúrese de preparar su simulacro enisNull()
lugar de, por ejemploanyLong()
.Así que esto:
se convierte en:
fuente
Este es mi caso:
//given ObjectA a = new ObjectA(); ObjectB b = mock(ObjectB.class); when(b.call()).thenReturn(a); Target target = spy(new Target()); doReturn(b).when(target).method1(); //when String result = target.method2();
Entonces me sale este error:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2() method2() should return String
¿Puedes adivinar?
El problema es que Target.method1 () es un método estático. Mockito me advierte completamente de otra cosa.
fuente