Solución:
Mockito mock funciona cuando nos burlamos de los objetos sin apretar.
Aquí está el cambio que hice para que funcione:
when(controlWfDefTypeService.getDqCntlWfDefnTypCd(any(DqCntlWfDefn.class))
.thenReturn(dqCntlWfDefnTyp);
En lugar de pasar el objeto de la clase Mock, pasé la clase con Matcher any()
y funciona.
TL; DR Si algunos argumentos en su prueba son null
, asegúrese de simular la llamada de parámetro con isNull()
en lugar de any(SomeClass.class)
.
Explicación
Puede que esta no sea la respuesta que ayude a OP, pero podría ser útil para otra persona. En mi caso, la configuración fue buena, sin embargo, algunos simulacros devolvieron el deseado thenReturn(...)
valor y algunos no lo hicieron.
Es importante comprender que la llamada al método que está intentando simular (es decir, el método en when(someMock.methodToMock)
) tiene que coincidir la llamada real y no la firma solamente.
En mi caso, me burlé de un método con una firma:
public void SomeValue method(String string, SomeParam param)
Sin embargo, la llamada en la prueba fue algo como:
method("some string during test", null);
Ahora, si te burlas de la llamada con:
when(MockedClass.method(anyString(), any(SomeParam.class))
Mockito no coincidirá con él aunque la firma sea correcta. El problema es que Mockito busca una llamada de method()
con los argumentos String
y SomeParam
, mientras que la llamada real fue con un String
y null
. Lo que tienes que hacer es:
when(MockedClass.method(anyString(), isNull())
Insinuación
Ya que hay muchos isNull()
implementaciones en diferentes marcos, asegúrese de utilizar este org.mockito.ArgumentMatchers.isNull
.
Creo que encontré tu problema, pero no todo el mérito es mío.
Dado que está tratando de simular ‘dqCntlWfDefnTyp’ en su clase de prueba y el objeto en sí está siendo instanciado en la clase que está tratando de probar, inevitablemente se encuentra con algunos problemas. El problema principal es que el objeto no se puede burlar porque se está recreando durante la prueba.
Hay algunas opciones, pero la mejor opción en mi humilde opinión es usar PowerMockito. Podrá reemplazar el objeto dentro de la clase que se está probando con el que se burla.
Un excelente ejemplo de este uso de PowerMockito de @raspacorp en esta pregunta:
public class MyClass {
void method1{
MyObject obj1=new MyObject();
obj1.method1();
}
}
Y la clase de prueba …
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class MyClassTest {
@Test
public void testMethod1() {
MyObject myObjectMock = mock(MyObject.class);
when(myObjectMock.method1()).thenReturn(<whatever you want to return>);
PowerMockito.whenNew(MyObject.class).withNoArguments().thenReturn(myObjectMock);
MyClass objectTested = new MyClass();
objectTested.method1();
... // your assertions or verification here
}
}