2016-08-31 2 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'. Таким образом, каждый раз, когда он называется, вы получаете новый объект. Вероятно, вам нужно передать тот же самый объект ('SomeService.Dummy') при вызове' dodo.doWork (expectedParameter) ', т. Е.' Dodo.doWork (expectedParameter) (SomeService.Dummy) '. –

+0

Если вы не передадите неявный параметр, Scala добавит его для вас (из 'scala.Predef.DummyImplicit # dummyImplicit') –

+0

Хорошо, я сделал плохой пример. Я обновил его тем, что не предопределено. –

ответ

0

неявный параметр со значением по умолчанию указует компилятор: если неявный не найден обычным неявным процесс поиска, используйте это значение вместо испускать ошибку компиляции.

DummyImplicit всегда находится на первом этапе (с использованием Predef.dummyImplicit), поэтому значение по умолчанию никогда не используется.

+0

Хорошо, тогда я сделал пример. Я обновляю свой вопрос чем-то другим, чем DummyImplicit. Спасибо, что указал, между прочим. –