47 votes

Exception Mockito - when() requiert un argument qui doit être un appel de méthode sur un mock.

J'ai un scénario de test très simple qui utilise Mockito et le framework Spring Test. Lorsque je fais

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

Je reçois cette exception.

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)

J'ai essayé avec différentes méthodes mais je continue à obtenir ce message d'erreur. J'utilise Spring 3.1.0.RELEASE avec Mockito. Veuillez partager et me guider dans la bonne direction.

55voto

Ralph Points 42744

Vous devez d'abord créer un MOCK de pcUserService, puis utiliser ce mock.

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

29voto

djkelly99 Points 398

Au cas où d'autres personnes rencontreraient ce problème....

Il se peut également que la méthode que vous essayez de simuler, pcUserService.read est déclaré comme un final méthode. D'après ce que j'ai remarqué, cela semble causer des problèmes avec Mockito.

14voto

CoolMind Points 11

Si vous utilisez Kotlin vous devez savoir que les méthodes sont final par défaut. Ainsi, écrivez open fun au lieu de fun . Merci à @djkelly99 pour un conseil.

7voto

Saran Points 901

Une autre solution à ce problème pourrait être que dans le cas d'une classe de test qui utilise PowerMockRunner vous devrez peut-être ajouter la classe dont vous vous moquez à la liste, dans le champ @PrepareForTest annotation.

Par exemple -

@PrepareForTest({ PcUserService.class })

3voto

Thomás Preis Points 31

J'ai eu le même problème, la méthode que j'essayais de simuler était une méthode finale. J'ai supprimé le modificateur et tout s'est bien passé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X