2012-02-08 23 views
21

Tengo un caso de prueba muy simple que está usando el marco Mockito y Spring Test. Cuando lo hagoExcepción de Mockito - cuando() requiere un argumento que tiene que ser una llamada a un método en un simulacro

when(pcUserService.read("1")).thenReturn(pcUser); 

Tengo esta excepción.

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 

    at com.project.cleaner.controller.test.PcUserControllerTest.shouldGetPcUser(PcUserControllerTest.java:93) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 

He intentado con diferentes métodos pero sigo recibiendo este mensaje de error. Estoy usando Spring 3.1.0.RELEASE con Mockito. Por favor comparte y guíame en la dirección correcta.

+0

tengo el mismo problema, pero estoy usando: @Autowired @ReplaceWithMock (beanName = "logDao") privada LogDao logDaoMock; –

Respuesta

20

Primero debe crear un MOCK de pcUserService y luego usar ese simulacro.

PcUserService mock = org.mockito.Mockito.mock(PcUserService.class); 
when(mock.read("1")).thenReturn(pcUser); 
+0

Sí, eso funcionó. Gracias :) – jsf

+0

Pero no puedo depurar en ese caso. ¿realmente llama a ese método? – eatSleepCode

+0

@eatSleepCode: el método REAL 'PcUserService.read' nunca se invoca en este ejemplo. En cambio, se invoca un Mockito Mock, y este simulacro devuelve 'pcUser' – Ralph

9

En caso de que otros golpeó este tema ....

También podría darse el caso de que el método que está tratando de burlar a cabo, pcUserService.read, se declara como un método final. Por lo que he notado esto parece causar problemas con Mockito.

0

Otra solución a este problema podría ser que en el caso de una clase de prueba que usa PowerMockRunner, es posible que deba agregar la clase que se está burlando a la lista, en la anotación @PrepareForTest.

Por ejemplo -

@PrepareForTest({ PcUserService.class })

0

Hay otra posible razón para tal error - a veces IDE prefiere importar estáticamente Mockito.when() de otro paquete:

import static io.codearte.catchexception.shade.mockito.Mockito.when; 

vs

import static org.mockito.Mockito.when; //should normally use this one 

La cosa es 'cuándo' de i El paquete o.codearte es compatible con org.mockito.Mockito.any() en el nivel de compilación, pero falla durante el tiempo de ejecución con exactamente el mismo mensaje de error.

Cuestiones relacionadas