18

2つのメソッドを持つJavaクラス(mockitoから取得)を指定します。

OngoingStubbing<T> thenReturn(T value);

OngoingStubbing<T> thenReturn(T value, T... values);

私がscalaから呼び出す場合

....thenReturn("something")

エラーが発生します:

Description Resource    Path    Location    Type
ambiguous reference to overloaded definition, both method thenReturn in trait OngoingStubbing of type (x$1: java.lang.Object, x$2: <repeated...>[java.lang.Object])org.mockito.stubbing.OngoingStubbing[java.lang.Object] and  method thenReturn in trait OngoingStubbing of type (x$1: java.lang.Object)org.mockito.stubbing.OngoingStubbing[java.lang.Object] match argument types (java.lang.String)

そして、私はこれを修正する方法を理解できません。

4

6 に答える 6

23

これは Scala と Java の相互運用性に関する既知の問題ですが、残念ながら FAQ には記載されていません。問題を説明するScala チケットを次に示します。基本的に、単一の引数を指定する場合は両方の方法を適用できます。現在、Scala コンパイラには、どちらが「より具体的」かを判断するためのヒューリスティックはありません。常に varargs バージョンを使用する Alexey Romanov のアプローチは、適切な回避策です。

thenReturn("something", Nil: _*)

JCommander で同様の問題が発生する質問もあります。そこにある答えの1つは、構造型を使用した巧妙な回避策です。このアプローチは舞台裏でリフレクションを使用するため、その方向に進みたい場合とそうでない場合があります。ユースケースでは、次のようになります。

type useSingleArgVersion = { def thenReturn(value: AnyRef): OngoingStubbing }
(...).asInstanceOf[useSingleArgVersion].thenReturn("something")

最後に、mokito で同様の問題が発生する同様の質問があります。実際には回避策はありませんが、問題が発生する理由に興味がある場合は、問題をもう少し詳しく説明しています。

于 2012-11-13T13:27:03.583 に答える
14

vararg バージョンの呼び出しが許容される場合、

thenReturn("something", Nil: _*)

現在、可変引数なしでメソッドを呼び出す方法は考えられません。

于 2012-11-13T10:10:42.153 に答える
13

これらの答えはすべて間違った質問です。違いは微妙ですが、これはリンクされたチケットの問題と同じ問題ではありません。非可変引数メソッドを呼び出すには、無理な体操が必要です。これについては、以下で十分です。

thenReturn[String]("something")

または、何らかの理由でそれを行いたくない場合は、型エイリアスとキャストは必要ありません。構造型の割り当てを直接使用できます。

(this: { def thenReturn[T](s: T): OngoingStubbing[T] }).thenReturn("something")

ここでの問題は、オーバーロードとポリモーフィズムの交差点での型推論です。1 つのメソッドはより具体的ですが、scalac はどちらを把握していません。SI-2991 の問題は、オーバーロードとタプル変換の間の相互作用による真のあいまいさです。どちらもより具体的ではありません。

于 2013-01-12T06:05:14.377 に答える
1

回避策は非常に簡単です。

OngoingStubbing<T> thenReturn(T value);

OngoingStubbing<T> thenReturn(T value1, T valu2, T... values);

「varargs は空でない必要があります」機能はありません。

于 2012-11-13T10:08:54.807 に答える