java - Mockito verify() 失败,返回 "too many actual invocations"

标签 java mockito

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

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

失败并出现以下错误:

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:

所以我改成了这样:

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

现在它失败了:

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

因为这是返回 null:

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

这似乎令人费解 - 如果我使用默认值(仅一次调用),它会失败,因为它被多次调用,但如果我告诉它多次调用没问题,它会失败,因为它找不到任何调用!

有人可以帮忙吗?

最佳答案

看起来你们都想模拟调用 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);

关于java - Mockito verify() 失败,返回 "too many actual invocations",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12609976/

相关文章:

java - 如何在jdbc中获取可调用列名

c++ - 自由人 : Unable to compile the Java API on Ubuntu

java - 使用 jquery 获取值

java - Mockito 匹配器如何工作?

android - 如何模拟采用回调对象和调用者使用回调委托(delegate)结果的方法

java - double 到 int 的转换

java - 在 netbeans 上运行项目时选择 "Remember permanently"后尝试更改服务器

java - Spring & Mockito : Actual Object getting called in Unit Test

mockito - 我可以在 mockito 参数中混合一个匹配器和 1 个精确值吗

java - Mockito - 覆盖采用原始参数的方法