2016-08-31 6 views
1

MockitoとScalaのデフォルトパラメータを使用していくつかの動作を理解したいと思います。ここで暗黙的なデフォルト値を持つメソッド呼び出しを確認する

は最小限の例です:

trait SomeImplicit 

object SomeService { 
    val AnyImplicit = new SomeImplicit {} 
} 

trait SomeService { 
    def doWork(param: String)(implicit di: SomeImplicit = SomeService.AnyImplicit) 
} 

はのはdoWorkメソッドを呼ぶことにしましょう:

自発的に
class SomeService$Test extends WordSpec with MockitoSugar { 
    "SomeService" should { 
    "doWork" in { 
     val dodo = mock[SomeService] 
     val expectedParameter = "ok" 

     dodo.doWork(expectedParameter) 

     verify(dodo, times(1)).doWork(expectedParameter)(SomeService.AnyImplicit) 
     verifyNoMoreInteractions(dodo) 
    } 
    } 
} 

、私はそれがうまくいくのに必要があるだろう。しかし、そうではありません。私が取得:

Argument(s) are different! Wanted: 
someService.doWork(
    "ok", 
    [email protected] 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:25) 
Actual invocation has different arguments: 
someService.doWork(
    "ok", 
    null 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:23) 

Argument(s) are different! Wanted: 
someService.doWork(
    "ok", 
    [email protected] 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:25) 
Actual invocation has different arguments: 
someService.doWork(
    "ok", 
    null 
); 
-> at SomeService$Test$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SomeService$Test.scala:23) 
+0

'DummyImplicit.dummyImplicit'の実装を見ると、' implicit def dummyImplicit:DummyImplicit = new DummyImplicit'と表示されます。だから、呼び出されるたびに新しいオブジェクトが得られます。 'dodo.doWork(expectedParameter)'、つまり 'dodo.doWork(expectedParameter)(SomeService.Dummy)'を呼び出すときは、おそらくまったく同じオブジェクト( 'SomeService.Dummy')を渡す必要があります。 –

+0

暗黙的なパラメータを渡さないと、Scalaは(scala.Predef.DummyImplicit#dummyImplicit'からの)あなたのために1を挿入します –

+0

良い、私は悪い例を取った。私はあらかじめ定義されていないものでそれを更新しました。 –

答えて

0

デフォルト値を持つ暗黙のパラメータは、コンパイラに指示します:暗黙のは、通常の暗黙の検索処理によって発見されていない場合は、コンパイルエラーを発するのではなく、この値を使用します。

DummyImplicitは、最初の手順で常に見つけられます(Predef.dummyImplicitを使用)ので、デフォルト値は使用されません。

+0

申し訳ありません、私はその後、私はDummyImplicit以外のもので私の質問を更新します。ところで、それを指摘してくれてありがとう。 –

関連する問題