Tomasz Nurkiewiczの答えは、全体像を示しているわけではないようです。
NB Mockitoバージョン:1.10.19。
私は非常にMockitoの初心者なので、次の動作を説明することはできません。この回答を改善できる専門家がいる場合は、お気軽にどうぞ。
ここで問題となっているメソッドはgetContentStringValue
、NOT final
およびNOT static
です。
この行は元のメソッドを呼び出しますgetContentStringValue
:
doReturn( "dummy" ).when( im ).getContentStringValue( anyInt(), isA( ScoreDoc.class ));
この行は元のメソッドを呼び出しませんgetContentStringValue
:
doReturn( "dummy" ).when( im ).getContentStringValue( anyInt(), any( ScoreDoc.class ));
答えられない理由で、を使用するisA()
と、意図された(?)「メソッドを呼び出さない」動作がdoReturn
失敗します。
ここに含まれるメソッドシグネチャを見てみましょう。どちらものstatic
メソッドですMatchers
。どちらもJavadocによって返されると言われていnull
ますが、それ自体で頭を動かすのは少し難しいです。おそらく、Class
パラメータとして渡されたオブジェクトが調べられますが、結果は計算されないか、破棄されません。これは任意のクラスを表すことnull
ができ、モックされたメソッドが呼び出されないことを望んでいることを考えると、ジェネリックパラメーターではなくのシグネチャisA( ... )
をany( ... )
返すことができませんでした* ?null
<T>
ともかく:
public static <T> T isA(java.lang.Class<T> clazz)
public static <T> T any(java.lang.Class<T> clazz)
APIドキュメントには、これに関する手がかりはありません。また、このような「メソッドを呼び出さない」動作の必要性は「非常にまれ」であると言っているようです。個人的に私はいつもこのテクニックを使用しています。通常、モックには「シーンを設定」する数行が含まれ、その後にメソッドを呼び出して、ステージングしたモックコンテキストでシーンを「再生」します。 。そして、あなたが風景と小道具をセットアップしている間、あなたが望む最後のことは、俳優が左のステージに入り、彼らの心を演じ始めることです...
しかし、これは私の給料等級をはるかに超えています...私は通りすがりのモッキト大祭司からの説明を招待します...
*「ジェネリックパラメータ」は正しい用語ですか?