28

次の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())

これは不可解なようです-デフォルト(1回の呼び出しのみ)を使用すると、複数回呼び出されているため失敗しますが、複数回の呼び出しで問題ないと言った場合、呼び出しが見つからないため失敗します!

誰かがこれを手伝うことができますか?

4

3 に答える 3

26

が呼び出されたときに何が起こるかをモックし、返されたオブジェクトで呼び出されたことを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);
于 2012-09-26T20:46:28.503 に答える
3

メソッドを呼び出す回数を追加すると、問題も解決するはずです。

verify(aclient、times(2))。someMethod();

于 2021-12-14T20:34:38.760 に答える
2

同じエラーが断続的に発生します。@Mock誤って同じタイプの2つのをクラスに追加したことがわかりました。


@Mock
SomeClient aClient;

@Mock
SomeClient bClient;


@Test
void test(){
  verify(aClient).someMethod(any());  //passes and fails intermittently
}

2番目のモックを削除すると、フレークネスが修正されました。

于 2021-01-07T17:24:41.377 に答える