具有隐式泛型类型的 Scala 模拟函数
Scala mock function with implicit generic types
我正在尝试使用 scalamock 模拟 Cassandra 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: com.datastax.spark.connector.types.TypeConverter[String], implicit evidence: com.datastax.spark.connector.types.TypeConverter[String])Map[String,String] <and> (index: Int)(implicit evidence: com.datastax.spark.connector.types.TypeConverter[String], implicit evidence: com.datastax.spark.connector.types.TypeConverter[String])Map[String,String]
我该如何模拟这个方法?
也许这个例子有帮助:
"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])
.
显式模拟了该参数列表
我正在尝试使用 scalamock 模拟 Cassandra 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: com.datastax.spark.connector.types.TypeConverter[String], implicit evidence: com.datastax.spark.connector.types.TypeConverter[String])Map[String,String] <and> (index: Int)(implicit evidence: com.datastax.spark.connector.types.TypeConverter[String], implicit evidence: com.datastax.spark.connector.types.TypeConverter[String])Map[String,String]
我该如何模拟这个方法?
也许这个例子有帮助:
"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])
.