scala - telefonica - para que sirve name id
¿Cómo burlarse de un argumento de llamada por nombre(como getOrElse) usando ScalaMock? (1)
El truco consiste en utilizar la versión del Product
del método onCall
, convertir el segundo argumento en () => String
y llamarlo:
class CallByNameMockSpec extends Specification with MockFactory {
trait ToBeMocked {
def getOrElse(arg: Int)(orElse: => String): String
}
"Mocking functions with call-by-name arguments" should {
"work" in {
val m = mock[ToBeMocked]
(m.getOrElse (_: Int)(_: String)).expects(101, *).onCall(_.productElement(1).asInstanceOf[() => String]())
m.getOrElse(101)("result") must beEqualTo("result")
}
}
}
Me gustaría poder getOrElse
un valor de getOrElse
método getOrElse
para que devuelva lo que se pasa como el orElse
llamada por nombre de orElse con ScalaMock
trait ToBeMocked {
def getOrElse(arg: Int)(orElse: => String): String
}
ScalaMock tiene que ser utilizado debido al currying. Ejecutando esto:
class CallByNameMockSpec extends Specification with MockFactory {
trait ToBeMocked {
def getOrElse(arg: Int)(orElse: => String): String
}
"Mocking functions with call-by-name arguments" should {
"work" in {
val m = mock[ToBeMocked]
(m.getOrElse (_: Int)(_: String)).expects(101, *).onCall((x, y) => y)
m.getOrElse(101)("result") must beEqualTo("result")
}
}
}
arroja una excepción:
[error] ClassCastException:
test.service.CallByNameMockSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$3$$anonfun$apply$4 cannot be cast to java.lang.String (CallByNameMockSpec.scala:16)