web-dev-qa-db-fra.com

Mockito verify () échoue avec "trop ​​d'appels réels"

J'ai un cas de test assez complexe auquel j'essaie d'ajouter la vérification () suivante:

verify(userService).getUserById(anyLong()).setPasswordChangeRequired(eq(Boolean.TRUE));

Cela échoue avec cette erreur:

org.mockito.exceptions.verification.TooManyActualInvocations: 
userService.getUserById(<any>);
Wanted 1 time:
-> at     test.controllers.AuthenticationControllerMockTest.testLookupsExceeded(AuthenticationControllerMockTest.Java:404)
But was 4 times. Undesired invocation:

Je l'ai donc changé en ceci:

verify(userService, atLeastOnce()).getUserById(anyLong()).setPasswordChangeRequired(eq(Boolean.TRUE));

Et maintenant ça échoue avec:

Java.lang.NullPointerException
    at test.controllers.AuthenticationControllerMockTest.testLookupsExceeded(AuthenticationControllerMockTest.Java:404)

car cela renvoie null:

verify(userService, atLeastOnce()).getUserById(anyLong())

Cela semble déroutant - Si j'utilise la valeur par défaut (une seule invocation), elle échoue car elle est invoquée plusieurs fois, mais si je lui dis que plusieurs invocations sont OK, elle échoue car elle ne trouve aucune invocation!

Quelqu'un peut-il m'aider?

21
user1071914

Il semble que vous vouliez tous les deux vous moquer de ce qui se passe lorsque userService.getUserById() est appelé, et vérifiez également que setPasswordChangeRequired(true) est appelé sur cet objet renvoyé.

Vous pouvez accomplir cela avec quelque chose comme:

UserService userService = mock(UserService.class);
User user = mock(User.class);
when(userService.getUserById(anyLong())).thenReturn(user);

...

// invoke the method being tested

...

verify(user).setPasswordChangeRequired(true);
20
matt b