Scalamock: невозможно имитировать функцию с типизированным параметром и несколькими неявными переменными

Этот вопрос является расширением решенной проблемы, упомянутой в https://github.com/paulbutcher/ScalaMock/issues/79

У меня есть следующая черта, чтобы издеваться:

trait HttpClient{
   def deserialize[T](response: HttpResponse)
                    (implicit um: Unmarshaller[ResponseEntity, T],
                     executionContext: ExecutionContext): Future[T]
}

Я пытаюсь издеваться над HttpClient следующим образом

val client = mock[HttpClient]

case class SomeTypeT(name:String, id:Int)
implicit val someTypeTFormat = jsonFormat2(SomeTypeT)   // to be able to marshal and unmarshal from JSON

(httpClient.deserialize[SomeTypeT](_: HttpResponse))
.expects(where {
  (response: HttpResponse) => {
    response.entity == ent
  }
})
.returns(Unmarshal(response.entity).to[SomeTypeT])

Проблема возникает, когда я пытаюсь смоделировать функцию десериализации. Как и выше, метод deserialize состоит из типизированного параметра T и одного параметра типа HttpResponse, а также еще двух неявных параметров, используемых при разборе ответа.

Таким образом, вопрос заключается в том, как использовать ScalaMock для имитации функции deserialize и указания нескольких неявных параметров во время имитации. Это не работает

// Both UnMarshaller & ExecutionContext are available here as implicits
(httpClient.deserialize[SomeTypeT](_: HttpResponse)(_: Unmarshaller[ResponseEntity, SomeTypeT](_: ExecutionContext))

Проблема в том, что я не могу использовать _ для указания обоих неявных параметров. И я не знаю, как этого добиться. Пожалуйста, помогите, как издеваться над данной функцией

Я использую следующие библиотеки:

  • Скала версии 2.11.8
  • скорейшая версия 3.0.0
  • скаламок версии 3.5.0

Хотя вторая попытка даже не компилируется из-за использования нескольких _, первая приводит к следующему исключению:

org.scalamock.function.MockFunction3 cannot be cast to org.scalamock.function.MockFunction1
java.lang.ClassCastException: org.scalamock.function.MockFunction3 cannot be cast to org.scalamock.function.MockFunction1

person Agraj    schedule 09.05.2017    source источник


Ответы (1)


Следуя ответу на GitHub, который вы связали, ваш код должен выглядеть примерно так

(httpClient.deserialize[SomeTypeT](_: HttpResponse)(_:  Unmarshaller[ResponseEntity, SomeTypeT], _:ExecutionContext))
.expects(where {
  (response: HttpResponse, _:  Unmarshaller[ResponseEntity, SomeTypeT], _:ExecutionContext) => {
    response.entity == ent
  }
})
.returns(Unmarshal(response.entity).to[SomeTypeT])

т.е. вы явно ставите заполнители для неявных параметров в вызове в качестве второй группы параметров и в where в качестве дополнительных параметров после всех неявных.

person SergGr    schedule 10.05.2017
comment
Спасибо, это работает. Мне не хватало добавления тех же неявных параметров в оператор where, как вы правильно указали. - person Agraj; 10.05.2017