web-dev-qa-db-fra.com

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

J'ai un cas de test très simple qui utilise la structure Mockito et Spring Test. Quand 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 continue à recevoir ce message d'erreur. J'utilise Spring 3.1.0.LELEASE avec Mockito. S'il vous plaît partager et me guider dans la bonne direction.

29
jsf

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);
31
Ralph

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

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

17
djkelly99

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

4
CoolMind

J'avais le même problème, la méthode que j'essayais de me moquer était une méthode finale. J'ai enlevé le modificateur et cela a bien fonctionné.

2
Thomás Preis

Il existe une autre raison possible à cette erreur: parfois, IDE préfère importer Mockito.when () de manière statique à partir d'un autre package:

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

contre

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

La chose est "quand" du paquet io.codearte est compatible avec org.mockito.Mockito.any () au niveau de la compilation, mais échoue lors de l'exécution avec le même message d'erreur.

0
Michał 'PuszekSE'