2012-02-08 11 views
21

Ho un caso di test molto semplice che utilizza Mockito e il framework Spring Test. Quando faccioEccezione Mockito - when() richiede un argomento che deve essere una chiamata di metodo su un simulato

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

Ricevo questa eccezione.

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) 

Ho provato con metodi diversi ma continuo a ottenere questo messaggio di errore. Sto usando Spring 3.1.0.RELEASE con Mockito. Per favore condividi e guidami nella giusta direzione.

+0

Ho lo stesso problema, ma sto usando: @Autowired @ReplaceWithMock (beanName = "logDao") privato LogDao logDaoMock; –

risposta

20

È necessario creare prima un MOCK di pcUserService, quindi utilizzare tale simulazione.

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

Sì, ha funzionato. Grazie :) – jsf

+0

Ma non riesco a eseguire il debug in questo caso. in realtà chiama quel metodo? – eatSleepCode

+0

@eatSleepCode: il metodo REAL 'PcUserService.read' non viene mai richiamato in questo esempio. Invece un Mockito Mock viene richiamato, e questo mock restituisce 'pcUser' – Ralph

9

Nel caso in cui gli altri ha colpito questo problema ....

Potrebbe anche essere il caso che il metodo che si sta cercando di prendere in giro fuori, pcUserService.read, è dichiarato come un metodo final. Da quello che ho notato questo sembra causare problemi con Mockito.

0

Un'altra soluzione a questo problema potrebbe essere che in caso di una classe di test che utilizza PowerMockRunner, potrebbe essere necessario aggiungere la classe che si sta deridendo all'elenco, nell'annotazione @PrepareForTest.

Per esempio -

@PrepareForTest({ PcUserService.class })

0

C'è un altro motivo possibile per tale errore - a volte IDE preferisce importare staticamente Mockito.when() da un altro pacchetto:

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

vs

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

La cosa è "quando" da Il pacchetto o.codearte è compatibile con org.mockito.Mockito.any() a livello di compilazione, ma non riesce durante il runtime con lo stesso identico messaggio di errore.