Mockito verify() 因“实际调用过多”而失败

2022-09-01 13:17:30

我有一个相当复杂的测试用例,我试图添加以下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)

因为这返回空值:

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

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

任何人都可以帮忙吗?


答案 1

看起来你们俩都想模拟被调用时发生的情况,并验证在返回的对象上调用了该对象。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);

答案 2

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

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


推荐