2016-11-28 78 views
1

我試圖嘲笑卡桑德拉ScalaGettableData對象使用scalamock。我需要模擬下面的方法:斯卡拉模擬函數與隱含泛型

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

TypeConverterTrait並具有隱含的實現,例如:

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] 

我怎麼嘲笑這種方法嗎?

+0

看看http://stackoverflow.com/a/2983376/411944關於上下文邊界如何工作。 – Reactormonk

回答

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])

+0

儘管此答案可能會解決問題,但您可以通過解釋代碼的工作原理或方式來提高答案的質量。 「教一個人釣魚」的東西。 –

+0

:)有10分。當回覆確切文章(問題或答案)作者以外的人時,請確保將它們標記爲@Username,甚至還有參與用戶的自動完成。 –