4

Mockito + PowerMock を使用してモックする静的メソッドがいくつかあります。例外のみをスローする(そして他に何もしない)静的メソッドをモックしようとするまで、すべてが正しかった。

私のテストクラスは次のようになります。

上:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Secure.class, User.class, StringUtils.class})

体:

    PowerMockito.mockStatic(Secure.class);
    Mockito.when(Secure.getCurrentUser()).thenReturn(user);

    PowerMockito.mockStatic(StringUtils.class);
    Mockito.when(StringUtils.isNullOrEmpty("whatever")).thenReturn(true);

    PowerMockito.mockStatic(User.class);
    Mockito.when(User.findById(1L)).thenReturn(user); // exception !! ;(

    boolean actualResult = service.changePassword();

changePassword メソッドは次のとおりです。

  Long id = Secure.getCurrentUser().id;

  boolean is = StringUtils.isNullOrEmpty("whatever");

  User user = User.findById(1L);
  // ...

最初の 2 つの静的呼び出しは正常に機能しますが (3 番目をコメントアウトした場合)、最後の呼び出し ( User.findById(long id) ) は「Mockito.when」メソッドで呼び出されている間に例外をスローします。このメソッドは次のようになります。

 public static <T extends JPABase> T findById(Object id) {
        throw new UnsupportedOperationException("Please annotate your JPA model with @javax.persistence.Entity annotation.");
    }

私の質問は、このメソッドをモックして期待どおりの結果を得るにはどうすればよいですか? 助けてくれてありがとう。


編集:

すべての返信に感謝します。解決策を見つけました。User.class に直接ではなく、User が拡張する GenericModel.class にあるメソッド findById をモックしようとしていました。今、すべてが完全に機能します。

4

1 に答える 1

2

これを変更してみてください:

PowerMockito.mockStatic(User.class);
Mockito.when(User.findById(1L)).thenReturn(user);

これに:

PowerMockito.mockStatic(User.class);
PowerMockito.doReturn(user).when(User.class, "findById", Mockito.eq(1L));

こちらのドキュメントを参照してください:

于 2013-03-20T17:34:19.817 に答える