web-dev-qa-db-ja.com

Mockitoは人数に関係なくメソドをスタブできますか?

私はMockitoを使ってレガシーコードをテストしようとしています。

次のように本番環境で使用されるFooDaoをスタブします。

foo = fooDao.getBar(new Bazoo());

私は書くことができます:

when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);

しかし明らかな問題は、getBar()がメソッドをスタブしたのと同じBazooオブジェクトで呼び出されることは決してないということです。 (new演算子を呪いなさい!)

引数に関係なくmyFooを返すような方法でメソッドをスタブできるのであれば、それが大好きです。それでも失敗した場合は、他の回避策の提案に耳を傾けますが、妥当なテスト範囲が得られるまで本番コードを変更しないようにしたいです。

259
Eric Wilson
when(
  fooDao.getBar(
    any(Bazoo.class)
  )
).thenReturn(myFoo);

または(nullsを回避するため)

when(
  fooDao.getBar(
    (Bazoo)notNull()
  )
).thenReturn(myFoo);

Matcherをインポートすることを忘れないでください(他にもたくさんあります)。

Mockito 2.1.0以降の場合

import static org.mockito.ArgumentMatchers.*;

古いバージョンの場合

import static org.mockito.Matchers.*;
399

このように使用してください:

when(
  fooDao.getBar(
    Matchers.<Bazoo>any()
  )
).thenReturn(myFoo);

Mockito.Matchersをインポートする必要がある前に

15
user3975308

http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html

anyObjectはあなたのニーズに合うはずです。

また、hashCodeの実装を常に検討することができ、Bazooクラスと同等です。これはあなたのコード例があなたが望むように働くようにするでしょう。

12
Buhb