gpt4 book ai didi

具有隐式泛型类型的 Scala 模拟函数

转载 作者:行者123 更新时间:2023-12-02 20:54:55 25 4
gpt4 key购买 nike

我正在尝试使用 scalamock 模拟 Cassandra ScalaGettableData 对象。我需要模拟以下方法:

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

TypeConverter 是一个 Trait 并且具有隐式实现,例如:

隐式对象 StringConverter 扩展 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]

我应该如何模拟这个方法?

最佳答案

也许这个例子有帮助:

"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]) 显式模拟出来.

关于具有隐式泛型类型的 Scala 模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40842904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com