Фиктивная функция 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])
,