Я хотел бы понять некоторое поведение с использованием параметров по умолчанию 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'. Таким образом, каждый раз, когда он называется, вы получаете новый объект. Вероятно, вам нужно передать тот же самый объект ('SomeService.Dummy') при вызове' dodo.doWork (expectedParameter) ', т. Е.' Dodo.doWork (expectedParameter) (SomeService.Dummy) '. –
Если вы не передадите неявный параметр, Scala добавит его для вас (из 'scala.Predef.DummyImplicit # dummyImplicit') –
Хорошо, я сделал плохой пример. Я обновил его тем, что не предопределено. –