私はMockitoを使ってレガシーコードをテストしようとしています。
次のように本番環境で使用されるFooDao
をスタブします。
foo = fooDao.getBar(new Bazoo());
私は書くことができます:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
しかし明らかな問題は、getBar()
がメソッドをスタブしたのと同じBazoo
オブジェクトで呼び出されることは決してないということです。 (new
演算子を呪いなさい!)
引数に関係なくmyFoo
を返すような方法でメソッドをスタブできるのであれば、それが大好きです。それでも失敗した場合は、他の回避策の提案に耳を傾けますが、妥当なテスト範囲が得られるまで本番コードを変更しないようにしたいです。
when(
fooDao.getBar(
any(Bazoo.class)
)
).thenReturn(myFoo);
または(null
sを回避するため)
when(
fooDao.getBar(
(Bazoo)notNull()
)
).thenReturn(myFoo);
Matcherをインポートすることを忘れないでください(他にもたくさんあります)。
Mockito 2.1.0以降の場合
import static org.mockito.ArgumentMatchers.*;
古いバージョンの場合
import static org.mockito.Matchers.*;
このように使用してください:
when(
fooDao.getBar(
Matchers.<Bazoo>any()
)
).thenReturn(myFoo);
Mockito.Matchers
をインポートする必要がある前に
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObjectはあなたのニーズに合うはずです。
また、hashCodeの実装を常に検討することができ、Bazooクラスと同等です。これはあなたのコード例があなたが望むように働くようにするでしょう。