Фиктивная функция Scala с неявными родовыми типами

Я пытаюсь издеваться над Кассандрой ScalaGettableData объект, использующий скайлок Мне нужно издеваться над следующим методом:

def getMap[K : TypeConverter, V : TypeConverter](name: String) = get[Map[K, V]](name)

TypeConverter это Trait и имеет неявные реализации, такие как:

implicit object StringConverter extends TypeConverter[String]

В моем коде я звоню

scalaGettableData.getMap[String, String]("myMap")

и я думаю, что это неявно преобразуется в

scalaGettableData.getMap[StringConverter, StringConverter]("myMap")

Мой тестовый код выглядит следующим образом:

val cassandraRow1 = mock[ScalaGettableData]
(cassandraRow1.getMap[String, String] _).expects("localizations_config").returning(Map("key1" -> "value1"))`

Но я получаю ошибку компиляции:

Error:(28, 26) _ must follow method; cannot follow (name: String)(implicit evidence$3: com.datastax.spark.connector.types.TypeConverter[String], implicit evidence$4: com.datastax.spark.connector.types.TypeConverter[String])Map[String,String] <and> (index: Int)(implicit evidence$3: com.datastax.spark.connector.types.TypeConverter[String], implicit evidence$4: com.datastax.spark.connector.types.TypeConverter[String])Map[String,String]

Как я должен издеваться над этим методом?

1 ответ

Решение

Может быть, этот пример помогает:

"implicit parameters" should "be mockable" in {
  trait Bar[T]
  trait Foo {
    def getMap[K : Bar](name: String): Int
  }

  val m = mock[Foo]
  (m.getMap[Long](_: String)(_: Bar[Long])) expects(*, *) returning 42 once()

  implicit val b = new Bar[Long] {}
  m.getMap("bar")
}

Эффективно, параметр типа K : Bar компилятор Scala преобразуется во второй список параметров, который в этом примере явно удаляется (_: Bar[Long]),

Другие вопросы по тегам