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)
'DummyImplicit.dummyImplicit'の実装を見ると、' implicit def dummyImplicit:DummyImplicit = new DummyImplicit'と表示されます。だから、呼び出されるたびに新しいオブジェクトが得られます。 'dodo.doWork(expectedParameter)'、つまり 'dodo.doWork(expectedParameter)(SomeService.Dummy)'を呼び出すときは、おそらくまったく同じオブジェクト( 'SomeService.Dummy')を渡す必要があります。 –
暗黙的なパラメータを渡さないと、Scalaは(scala.Predef.DummyImplicit#dummyImplicit'からの)あなたのために1を挿入します –
良い、私は悪い例を取った。私はあらかじめ定義されていないものでそれを更新しました。 –