Mockito verify()因"太多实际调用"而失败

use*_*914 20 java mockito

我有一个相当复杂的测试用例我试图将以下verify()添加到:

verify(userService).getUserById(anyLong()).setPasswordChangeRequired(eq(Boolean.TRUE));
Run Code Online (Sandbox Code Playgroud)

这失败了,出现此错误:

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:
Run Code Online (Sandbox Code Playgroud)

所以我改成了这个:

verify(userService, atLeastOnce()).getUserById(anyLong()).setPasswordChangeRequired(eq(Boolean.TRUE));
Run Code Online (Sandbox Code Playgroud)

现在它失败了:

java.lang.NullPointerException
    at test.controllers.AuthenticationControllerMockTest.testLookupsExceeded(AuthenticationControllerMockTest.java:404)
Run Code Online (Sandbox Code Playgroud)

因为这返回null:

verify(userService, atLeastOnce()).getUserById(anyLong())
Run Code Online (Sandbox Code Playgroud)

这看起来令人费解 - 如果我使用默认值(仅一次调用),它会失败,因为它被多次调用,但是如果我告诉它多次调用都没问题,它就会失败,因为它无法找到任何调用!

有人能帮忙吗?

mat*_*t b 19

看起来你们都想要模拟userService.getUserById()调用时发生的事情,并且还要验证setPasswordChangeRequired(true)在返回的对象上调用它.

您可以通过以下方式实现此目的:

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);
Run Code Online (Sandbox Code Playgroud)


小智 11

添加调用该方法的次数也应该可以解决该问题。

verify(aclient, times(2)).someMethod();