我希望能够模拟getOrElse
方法的返回值,以便它返回通过ScalaMock作为orElse
调用名称参数传递的内容
trait ToBeMocked {
def getOrElse(arg: Int)(orElse: => String): String
}
由于使用了Curala,因此必须使用ScalaMock。运行此:
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")
}
}
}
引发异常:
[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)
最佳答案
诀窍是使用Product
方法的onCall
版本,将第二个参数转换为() => String
并调用它:
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")
}
}
}
关于scala - 如何使用ScalaMock模拟按名称调用参数(如getOrElse)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294830/